287. 尋找重複數
給定乙個包含n + 1
個整數的陣列nums
,其數字都在1
到n
之間(包括1
和n
),可知至少存在乙個重複的整數。
假設nums
只有乙個重複的整數,找出這個重複的數。
示例 1:
輸入:nums = [1,3,4,2,2]
輸出:2
示例 2:
輸入:nums = [3,1,3,4,2]
輸出:3
示例 3:
輸入:nums = [1,1]
輸出:1
示例 4:
輸入:nums = [1,1,2]
輸出:1
高階:第一反應一般是對陣列排序,然後遍歷一次,遇到相鄰的兩個元素相等了,那這個數就是答案。但時間複雜度是o(n
logn
)o(nlogn)
o(nlog
n)(排序),會修改元素組,不滿足高階要求。
不難想到用乙個雜湊表set
存元素,即遍歷一遍陣列,元素都存入雜湊表,當出現重複的時候就是答案。時間複雜度o(n
)o(n)
o(n)
,空間複雜度o(n
)o(n)
o(n)
,空間複雜度不滿足條件高階要求。
常見的一種方法就是遍歷一遍陣列,讓陣列中的元素與下標一一對應,如nums[1] = 1,nums[2] = 2
,即讓nums[i] = nums[nums[i]]
,0~n
共有n+1
個下標,但是數字是1~n
,故有乙個下標對應的位置需要存兩個數,這個數就是重複的,當然這也改變了原陣列,不符合高階要求。不改變原陣列的話,也可以開闢乙個新陣列,用於計數,即遍歷一次陣列,temp[nums[i]]++
,之後遍歷一次temp
陣列,temp[i] > 1
的i
就是重複的數字,但不符合常量級 o(1
)o(1)
o(1)
的額外空間。
排除上述常見方法後,總算想到殺手鐗,二分演算法了。
注意:分的區間是數的範圍,而不是索引的範圍,如果在這個範圍的數字個數大於區間長度,那麼這個區間內一定有數字重複了。繼續對該區間進行劃分,直到區間長度為1為止。
時間複雜度:分治法為o(l
ogn)
o(logn)
o(logn
),每次都要統計區間範圍內的數字,複雜度為o(n
)o(n)
o(n)
,所以總的複雜度為o(n
logn
)o(nlogn)
o(nlogn)。
class
solution
else
}return left;
//實際上最後返回left還是right都可以,因為他們最後相等
287 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假設陣列是唯讀的 只能...
287 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...
287 尋找重複數
287.尋找重複數 給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假...