劍指Offer 面試題03 陣列中重複的數字

2021-10-05 03:43:12 字數 1222 閱讀 3256

找出陣列中重複的數字。

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

示例1

輸入:

[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3 

限制:

2 <= n <= 100000

1. 陣列排序(純暴力),時間複雜度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系列

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。這是一道考查二維陣列的理解和程式設計能力的題。在二維陣列在記憶體中是連續儲存的。在記憶體中從上到下儲存各行元素,在同一行中按照從左到右...