題目
題目鏈結 思路
題目大意:給乙個n+1大小的陣列,裡面的元素都在[1,n]這個範圍內,且只有乙個數是重複的,重複次數可能大於2,讓找到這個數;
看到這個題,我就想起了之前做的一道給n個數,其中有乙個數占整個陣列的一半以上,讓找到這個數,做法是保持乙個cnt計數器,用來記錄當前出現次數最多的數字出現的次數,如果當前這個數不等於當前出現次數最多的數,則cnt–,當cnt為零時,換乙個數接著做;當然跟這個題沒半毛錢關係,我屬實是閒的打這麼多字~~~~
這題其實是用二分做的,二分的作用就是讓你不斷地縮小解空間,直至解空間裡只有乙個元素時,那就是最後的解;
因為數是在1到n之間的,所以解空間是在[1,n]這個閉區間的,接下來讓我們用二分法來縮小子空間;
先取mid= (left+ right)/ 2,然後遍歷一遍整個陣列,找到小於等於mid的數有多少個:
如果cnt > mid,說明在[left, mid]這個閉區間上有重複數,令right = mid,繼續找;
如果cnt <= mid,說明在[mid + 1, right]這個閉區間上有重複數,令left = mid + 1,繼續找;
如果left == right,說明解空間已經收縮到只有乙個元素了,根據解的唯一性,這個數必定是解;
over~~
**
class
solution
//分情況討論
if(cnt <= mid) left = mid +1;
else right = mid;
}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之...