每日一題時間,今日份二分查詢get!
287.給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
示例 1:
輸入: [1,3,4,2,2]
輸出: 2
示例 2:
輸入: [3,1,3,4,2]
輸出: 3
說明:不能更改原陣列(假設陣列是唯讀的)。
只能使用額外的 o(1) 的空間。
時間複雜度小於 o(n2) 。
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
題目給出了很多的限制條件。看到題目大家都會想到很多解法。
1、使用乙個book陣列(可以用雜湊表優化),在遍歷陣列時記錄出現過的數字的個數,每一次遍歷判定一下該數字是否已經出現過,若已經出現過,結果就是它,此時時間複雜度為o(n),但是空間複雜度不滿足要求。
2、對陣列進行排序,獲得有序陣列,再對其進行遍歷兩兩比較,相等時即為結果。排序最快為o(nlogn),空間複雜度超出,且更改了原陣列。
要滿足題目所給要求,只能以時間換空間。且不能時暴力求解,否則時間複雜度又會過高。出題者也在暗示我們用二分查詢呀。
由於陣列長度為n+1,數值分布為1-n,所以必然有乙個數是重複的。以數值範圍為二分查詢的起始,即left=1,right=n,mid=(left+right)/2,對原陣列進行遍歷,統計小與等於mid的數的個數。脫離題目條件,假定一種理想情況,對於數值分布在1-n的、長度為n的無重複陣列array,其中小於等於mid的數的個數即mid。回到題目條件,若統計得到的個數嚴格大於mid,則重複的數值必然在left和mid之間,反之,在mid+1和right之間。這樣我們就可以排除一般的數值搜尋區間,時間複雜變為o(nlogn),且不使用額外空間。
class
solution}if
(temp>mid)
right=mid;
else
left=mid+1;
}return left;}}
;
LeetCode 287 尋找重複數
參考 給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只...
LeetCode 287(尋找重複數)
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...
leetcode287 尋找重複數
1.二分查詢 參考 可以認為有兩個陣列,乙個是原陣列,乙個是1 n的範圍陣列 無重複 每次對low high的範圍陣列做二分,取中間數mid,然後去原陣列中統計小於等於mid的數目,如果大於mid 如果無重複,那麼應該小於等於mid 說明重複的那個數字在1 mid之間,結合範圍即在 low mid之...