其他分享
首页 > 其他分享> > 剑指Offer 03. 数组中重复的数字

剑指Offer 03. 数组中重复的数字

作者:互联网

LeetCode_剑指Offer

03. 数组中重复的数字

一、题目描述
二、示例描述
三、解法分析

方案一:暴力求解

代码实现:

public class Solution {
    public int findRepeatNumber(int[] nums) {

        for (int i = 0; i < nums.length; i++) {
            for(int j = i+1; j< nums.length; j++){
                if(nums[i] == nums[j]){
                    return nums[i];
                }
            }
        }
        return -1;
    }
}

算法复杂度分析:

存在的问题:限制:2 <= n <= 100000,时间复杂度太高,提交代码结果会“超过时间限制”

方案二:哈希表

代码实现:

public class Solution {
    public int findRepeatNumber(int[] nums) {
    
        HashSet hashSet=new HashSet();
        for (int num : nums) {
            if(hashSet.contains(num)){
                return num;
            }
            hashSet.add(num);
        }
        return -1;
    }
}

方案三:原地置换

遍历萝卜坑{
	当前萝卜和萝卜坑不匹配 (循环){
		如果 萝卜应当待的坑中 坑和萝卜匹配{
			当前萝卜是多余重复的
		}
		将当前坑中萝卜 和 萝卜叮当待的坑中萝卜 交换
	}
}

代码实现:

public class Solution {
    public int findRepeatNumber(int[] nums) {
        
        int length = nums.length;
        if(nums == null || length<=0){//空数组
            return -1;
        }

        for(int i = 0; i < length; i++){
            if(nums[i]<0 || nums[i]>length-1){//数组不满足条件
                return -1;
            }
        }
        
        for (int i = 0; i < length; i++){
            while (nums[i] != i) {
                if (nums[nums[i]] == nums[i]) {
                    return nums[i];
                }
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }
}

算法复杂度分析:

标签:03,数字,nums,int,萝卜,复杂度,Offer,数组
来源: https://blog.csdn.net/qq_24410589/article/details/118498216