287 尋找重複數

2021-10-17 18:46:58 字數 1996 閱讀 7967

287. 尋找重複數

給定乙個包含n + 1個整數的陣列nums,其數字都在1n之間(包括1n),可知至少存在乙個重複的整數。

假設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] > 1i就是重複的數字,但不符合常量級 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 說明 不能更改原陣列 假...