1. 程式人生 > 其它 >【劍指offer】03.陣列中重複的陣列

【劍指offer】03.陣列中重複的陣列

劍指 Offer 03. 陣列中重複的數字

知識點:陣列;雜湊表;蘿蔔佔坑思想

題目描述

找出陣列中重複的數字。

在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。

示例
輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3 


解法一:暴力法

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

時間複雜度:O(N^N);

解法二:陣列排序

class Solution {
    public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        for(int i = 0; i < nums.length-1; i++){
            if(nums[i] == nums[i+1]){
                return nums[i];
            }
        }
        return -1;
    }
}

時間複雜度:O(N)+O(NlogN);

解法三:雜湊表

利用雜湊表不重複的性質,如果包括就把其返回,如果不重複就把其加入雜湊表;

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int i = 0; i < nums.length; i++){
            if(set.contains(nums[i])) return nums[i];
            else set.add(nums[i]);
        }
        return -1;
    }
}

時間複雜度:O(N);
空間複雜度:O(N);構建雜湊表的消耗;

解法四:一個蘿蔔一個坑

充分考慮到題目中的數字範圍,正好是0~n-1;所以可以依次將它們歸位,如果歸位過程中那個坑裡有了,那就證明這個重複了;

class Solution {
    public int findRepeatNumber(int[] nums) {
        int temp;
        for (int i = 0; i < nums.length; i++){
            while (nums[i] != i){   //i這個位置沒歸位就一直找下去;
                if (nums[i] == nums[nums[i]]) return nums[i];
                temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }
}

時間複雜度:0(N);

體會

一定要用集合的不可重複性;