nums
包含 n + 1
個(gè)整數(shù),每個(gè)整數(shù)是從 1
到 n
(包括邊界),保證至少存在一個(gè)重復(fù)的整數(shù)。假設(shè)只有一個(gè)重復(fù)的整數(shù),找出這個(gè)重復(fù)的數(shù)。
1.不能修改數(shù)組(假設(shè)數(shù)組只能讀)
2.只能用額外的O(1)的空間
3.時(shí)間復(fù)雜度小于O(n^2)
4.數(shù)組中只有一個(gè)重復(fù)的數(shù),但可能重復(fù)超過(guò)一次
給出 nums
= [5,5,4,3,2,1]
,返回 5
.
給出 nums
= [5,4,4,3,2,1]
,返回 4
.
1 int findDuplicate(vector &nums) {
2 // write your code here 3 int left=1,right=nums.size()-1;
4 int mid=left+(right-left)/2;
5 int left_num;
6 while(left
自己沒(méi)想出來(lái),照著網(wǎng)上的思路寫(xiě)了一個(gè)
left是1,right是n。mid算出來(lái)以后遍歷數(shù)組,看有多少小于等于它的,如果統(tǒng)計(jì)的數(shù)量小于等于mid這個(gè)數(shù)的本身,就說(shuō)明重復(fù)的數(shù)在比mid大的那邊。
于是就left=mid+1(因?yàn)椴粔蚵锼圆灰耍┗蛘遰ight=mid。最后left=right的值就是所求