劍指 offer 03. 陣列中重複的數字
首先可以注意到陣列長度為n
,所有的元素都在0~n-1
之間,所以可以開乙個長為n
的陣列用來記錄每個元素的次數,當某乙個元素的出現頻率大於2時,說明這是重複的,可以返回
class solution
// 記錄0~n-1範圍的數出現的頻率
int map = new int[n];
for(int i = 0; i < n; i++)
}return 0;}}
這裡由於資料的範圍可以確定在0~n-1
,所以可以不用使用雜湊表,因為雜湊表有擴容和複製操作,時間上會更長。
時間複雜度為o(n)
,空間複雜度為o(n)
。
還可以進行排序,如果有重複元素,那麼肯定是在相鄰處。
class solution
quicksort(nums, 0, n - 1);
for(int i = 0; i < n - 1; i++)
}return 0;
}public void quicksort(int nums, int l, int r)
} quicksort(nums, l, j);
quicksort(nums, j + 1, r);}}
快速排序的時間複雜度為o(nlogn)
,空間複雜度為o(1)
。
也可以使用set
來儲存陣列中的所有元素,嘗試把nums
中的每個元素都加入到set
中,如果新增失敗,則說明這是乙個重複元素,不能新增。
class solution
return -1;}}
時間複雜度為o(n)
,空間複雜度為o(n)
。
當然還有空間複雜度更低的解法,不過自己確實沒有想出來,是看完了題解之後想出來的。
因為我們已經得知數的範圍是在0~n-1
,且對於給定的陣列,索引範圍也是在0~n-1
,又因為有重複元素,所以肯定有索引和值的一對多關係,那麼我們可以遍歷所有值,以值為索引,那麼有如下情況:
①.nums[i] = i
,說明此數字已經放在了對應的位置,無需交換;
②.nums[nums[i]] = nums[i]
,說明索引nums[i]
和索引i
處的值都為nums[i]
,找到了一組重複的值,因此返回值nums[i]
;
③.都不等時,交換索引i
和nums[i]
的元素值,將數字交換到對應的索引位置處。
但是這裡需要注意寫法,只有當nums[i] = i
時,我們才遞增i
,否則持續交換,直到nums[i]
和i
不等且兩個指標指向的數相同時,說明是重複元素,返回即可。
class solution
if(nums[nums[i]] == nums[i]) return nums[i];
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}return -1;}}
時間複雜度為o(n)
,空間複雜度為o(1)
。 劍指offer03 陣列中重複的數字
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3限制 2 n 100000 首先拿到這道題最先想到的是...
劍指Offer03 陣列中重複的數字
劍指offer典型題整理 爭取做最好的題解 題目描述 在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限...
劍指offer 03陣列中重複的數字
找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 首...