找出陣列中重複的數字。
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。
示例1:
輸入:限制:[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
2 <= n <= 1000001. 陣列排序(純暴力),時間複雜度o(nlogn)
2. 雜湊,時間複雜度o(n),空間複雜度o(n)(雜湊表輔助)
3. 注意到陣列中的數字是在0到n-1之間的,那麼可以想一下,如果這個陣列沒有重複數字,那麼排好序的陣列中,i會出現在下標為i的位置。所以說,如果下標為i的位置的數字經過排序之後不是i,就說明出現了重複數字。從頭到尾依次掃瞄陣列中的每個數字,當掃瞄到下標為i的數字時,首先比較這個數字m是不是等於i。如果相等則掃瞄下乙個數字,否則將m和下標為m的數字進行比較,如果兩者相等則找到了重複數字,如果不等,則把m和下標為m的數字交換,重複比較直到找到重複的數字。對於每個數字,最多隻需要交換兩次,因此
總時間複雜度是o(n)
。而且所有步驟都在輸入的陣列上進行,所以不需要額外分配記憶體,
空間複雜度為o(1)
。這種方法也稱作陣列的「
原地置換」。
class solution
//接下來開始迴圈比較
for(int i = 0; i < length; i++)
//否則,交換兩者的位置
int t = nums[i];
nums[i] = nums[t];
nums[t] = t;}}
return false;
}};
class solution
//原地置換
for(int i = 0; i < nums.length; i++)
int t = nums[i];
nums[i] = nums[t];
nums[t] = t;}}
return -1;
}}
劍指Offer 面試題03 陣列中重複的數字
找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3限制 2 n 100000 初始...
《劍指offer》陣列相關面試題
在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...
面試題03 二維陣列中查詢 劍指offer系列
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。這是一道考查二維陣列的理解和程式設計能力的題。在二維陣列在記憶體中是連續儲存的。在記憶體中從上到下儲存各行元素,在同一行中按照從左到右...