HHR的小站
享受代码带来的快乐吧
首页
LeetCode 287. 寻找重复数
2020-02-07 |HHR | 代码使人快乐, LeetCode

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

示例 1:

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

示例 2:

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

说明:

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

class Solution {
public:
    int findDuplicate(vector<int> &nums) {
        int i = 1, j = nums.size() - 1;
        while (i != j) {
            int m = (i + j) / 2, count = 0;
            for (int num:nums) {
                if (num <= m) count++;
            }
            if (count > m) {
                j = m;
            } else {
                i = m + 1;
            }
        }
        return i;
    }
};

/*
 * 5,1,2,3,4,5,5,7,8,9,10,11
 * 在1-11中寻找
 * 重复的数是6或更小嘛?
 * 数一数发现,<=6的数有7个,说明重复的数<=6
 * 那去1-6中寻找
 * 重复的数<=3嘛?
 * <=3的数只有三个,没问题,重复的数比3大
 * 在4-5中寻找
 * 重复的数<=4嘛?
 * 比4小的数有四个,重复的数比4大
 * 所以,重复的数是5
 */

respond-post-165

添加新评论

请填写称呼
请填写合法的电子邮箱地址
请填写合法的网站地址
请填写内容