【劍指offer】03.陣列中重複的陣列
阿新 • • 發佈:2021-07-16
劍指 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);
體會
一定要用集合的不可重複性;