給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間,包括 1 和 n ,可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
示例 1:
示例 2:輸入: [1,3,4,2,2]
輸出: 2
說明:輸入: [3,1,3,4,2]
輸出: 3
不能更改原陣列(假設陣列是唯讀的)。
只能使用額外的 o(1) 的空間。
時間複雜度小於 o(n2) 。
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
由於限制了空間同時不能更改原陣列,導致我們不能使用 第乙個缺失的數字 中的解法,即元素按其值放入指定位置。
分析一下這道題,如果正常情況沒有重複數字,那麼從1~n只有n個數字,當有乙個重複數字時,1~n有n+1個數字。這樣我們就可以將n個數字從其中間數字m處分為兩半,如果1~m中數目超過m,那麼重複數字出現在1~m,反之則出現在m+1~n中。
這麼一看,這不是典型的二分法麼?
public int findduplicate(int nums)
public int findduplicatecore(int nums, int begin, int end)
int mid = begin + (end - begin) / 2;
int count = count(nums, begin, mid);
if (count > (mid - begin + 1)) else
} return -1;
} public int count(int nums, int begin, int end)
} return ret;
}
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之...