劍指 offer 03. 陣列中重複的數字
難度:簡單
找出陣列中重複的數字。
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。
示例 1:
可以利用雜湊表解決這個問題,限制:輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
2 <= n <= 100000
從頭到尾按順序掃瞄陣列的每個數字,每掃瞄乙個數字的時候,都可以用o(1) 的時間來判斷雜湊表裡是否已經包含了該數字。這個演算法的時間複雜度是o(n),但它提高時間效率是以乙個大小為o(n)的雜湊表為代價的。如果雜湊表裡還沒有這個數字,就把他加入到雜湊表。
如果雜湊表已經存在該數字,就找到乙個重複的數字。
class solution
return -1;
}}
空間複雜度o(1)
所有操作步驟都是在輸入陣列上進行的,不需要額外分配記憶體,因此空間複雜度為o(1)
我們注意到,陣列中的數字都在0~n-1的範圍內。如果這個陣列中沒有重複的數字,那麼當陣列排序之後,數字 i 將出現在下標 i 的位置。由於陣列中有重複的數字,有些位置可能存在多個數字,有些位置可能沒有數字。
思路:
重排這個陣列,從頭到尾依次掃瞄這個陣列的每乙個數字。開始迴圈 for (int i = 0; i < nums.length; i++)當掃瞄到下標為 i 的數字時,首先比較這個數字(用m表示)是不是等於 i 。比較 nums[i] 與 i 是否相等如果是,則接著掃瞄下乙個數字。如果nums[i] == i ,continue,如果不是,則再拿它和第m個數字進行比較。如果 nums[i] != i ,比較nums[i] 和 nums[nums[i]]如果它和第m個數字相等,就找到了第乙個重複的數字(該數字在下標為 i 和 m 出都出現了)。如果相等,返回nums[i]如果它和第m個數字不相等,就把第i個數字和第m個 數字交換,把m放到屬於它的位置。如果不相等,交換nums[i] 和 nums[nums[i]]位置 (有個小坑)
接下來再重複這個比較,交換的過程,直到我們發現乙個重複的數字。結束迴圈
2 3 1 0 2 5 31 3 2 0 2 5 3 第1次交換了第 0 處的 2 和 第 2 處的 1
1 0 2 3 2 5 3 第2次交換了第 1 處的 3 和 第 3 處的 0
1 0 2 3 2 5 3 第3次,第 2 處的 2 此時 i=nums[i] ,保持不變,繼續下次迴圈
1 0 2 3 2 5 3 第4次,第 3 處的 3 此時 i=nums[i] ,保持不變,繼續下次迴圈
1 0 2 3 2 ------> 輸出nums[2] = 2 第5次,第 4 處的 2 與 第 2 處的 2 相等,即出現了第乙個重複的數字
public int find2(int nums)
else if (nums[i] == nums[nums[i]])
// int a = nums[i];
// nums[i] = nums[nums[i]];
// nums[nums[i]] = a;
int a = nums[i];
nums[i] = nums[a];
nums[a] = a;
}return -1;
}
注意:在交換交換nums[i] 和 nums[nums[i]]位置時,注意寫法。
public int find2(int nums)
int a = nums[i];
nums[i] = nums[a];
nums[a] = a;}}
return -1;
}
每個數字最多交換兩次就能找到屬於自己的位置
也可以變成乙個排序的小演算法
public int find2(int nums)
}return nums;
}
劍指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 首...