1. 程式人生 > >劍指offer 2. 不修改陣列找出重複的數字

劍指offer 2. 不修改陣列找出重複的數字

給定一個長度為 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; } };