lc-287


/**
Given an array of integers nums containing n + 1 integers where each integer is 
in the range [1, n] inclusive. 

 There is only one repeated number in nums, return this repeated number. 

 You must solve the problem without modifying the array nums and uses only 
constant extra space. 

 
 Example 1: 

 
Input: nums = [1,3,4,2,2]
Output: 2
 

 Example 2: 

 
Input: nums = [3,1,3,4,2]
Output: 3
 

 
 Constraints: 

 
 1 <= n <= 10⁵ 
 nums.length == n + 1 
 1 <= nums[i] <= n 
 All the integers in nums appear only once except for precisely one integer 
which appears two or more times. 
 

 
 Follow up: 

 
 How can we prove that at least one duplicate number must exist in nums? 
 Can you solve the problem in linear runtime complexity? 
 
 Related Topics位运算 | 数组 | 双指针 | 二分查找 

 👍 1905, 👎 0 

*/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;
        int l = 1, r = n - 1, ans = -1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            int cnt = 0;
            for (int i = 0; i < n; ++i) {
                if (nums[i] <= mid) {
                    cnt++;
                }
            }
            if (cnt <= mid) {
                l = mid + 1;
            } else {
                r = mid - 1;
                ans = mid;
            }
        }
        return ans;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !