劍指offer 2. 不修改陣列找出重複的數字
阿新 • • 發佈:2019-01-01
給定一個長度為 n+1 的陣列nums,陣列中所有的數均在 1∼n 的範圍內,其中 n≥1。
請找出陣列中任意一個重複的數,但不能修改輸入的陣列。
樣例
給定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
思考題:如果只能使用 O(1) 的額外空間,該怎麼做呢?
把陣列分為 [l,mid] 和 [mid+1,r] 兩個區間,則必有一個區間數的個數大於區間長度。二分就能夠找到答案
class Solution {
public:
int duplicateInArray(vector<int> & nums) {
int l = 1, r = nums.size() - 1;
while (l < r) {
int mid = l + r >> 1;
int s = 0;
for (auto x : nums) s += x >= l && x <= mid;
if (s > mid - l + 1) r = mid;
else l = mid + 1;
}
return r;
}
};