題目描述
在一個長度爲 n 的數組 nums 裏的所有數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出數組中任意一個重複的數字。
我的解法
排序
先排序,在找
性能不好
數組記錄
用數據記錄出現的次數
空間換時間
public int findRepeatNumber(int[] nums) {
byte arr[] = new byte[nums.length];
for(int n: nums){
if(arr[n]==1)return n;
arr[n]=0b1;
}
return -1;
}
時間擊敗90%
時間複雜度:O(N)
空間複雜度:O(N)
其他解法
這個方法很精妙
若沒有重複,排序後元素nums[i]出現在的第i個
現在有重複,且沒有排序,
遍歷,判斷num[i]是不是第i個,不是則交換,同時在途中判斷是否有重複
public int findRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.length;i++){
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
算法是很巧妙
隨着遍歷進行,數組越來越有序,直到碰到第一個重複的數
性能很好,擊敗100%
時間複雜度O(N)
空間複雜度O(1)
其他還有些解法,什麼HashMap,感覺都沒什麼特色,想要時間換空間,使用數組比map更直接。