zoukankan      html  css  js  c++  java
  • LeetCode 每日一题 287. 寻找重复数

    给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

    示例 1:

    输入: [1,3,4,2,2]
    输出: 2
    

    示例 2:

    输入: [3,1,3,4,2]
    输出: 3
    

    说明:

        不能更改原数组(假设数组是只读的)。
        只能使用额外的 O(1) 的空间。
        时间复杂度小于 O(n2) 。
        数组中只有一个重复的数字,但它可能不止重复出现一次。
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-the-duplicate-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    二分答案即可,因为对于答案 ans

    • 所有 i (leq) ans , nums 中小于等于 i 的个数 (leq) i
    • 所有 i (gt) ans , nums 中小于等于 i 的个数 (ge) i

    显然,在 upper_bound 的基础上小改下就是了

    class Solution {
    public:
      int findDuplicate(vector<int>& nums) const{
        int len = nums.size() - 1;
        int first = 1, half, mid, c;
        while(len > 0) {
          half = len >> 1;
          mid = first + half;
          c = 0;
          for(int i : nums)
            c += i <= mid ? 1 : 0;
          if(c > mid)
            len = half;
          else {
            first = mid + 1;
            len = len - half - 1;
          }
        }
        return first;
      }
    };
    
  • 相关阅读:
    第一轮 J
    第一轮 M
    第一轮 L
    第一轮 K
    第一轮 I
    第一轮 H
    第一轮 F
    第一轮 E
    第一轮 C
    12杭州online E 模拟
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/12963474.html
Copyright © 2011-2022 走看看