0
点赞
收藏
分享

微信扫一扫

虚拟游戏理财 - 华为OD统一考试(C卷)

_刘彦辉 03-16 23:00 阅读 2

题目:

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

示例 1:

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

思路:

使用二分查找思想

  1. 找到左右边界,left right
  2. 当left < right 时,求得mid 遍历数组,找到小于mid的个数 count
  3. 比较count   
    1. 若count > mid ,则在左区间中查找重复数字【left, mid】
    2. 若count < mid,则在右区间中继续查找重复数字【mid+1, right】
  4. 当left = right 时,就找到了重复数字

代码

class Solution {
    public int findDuplicate(int[] nums) {
        // 二分查找
        int length = nums.length;
        // 在[1,n]中查找重复元素
        int left = 1;
        int right = length - 1;

        while(left < right){
            int mid = (left + right) / 2;

            // 循环整个数组 计算【1,mid】的数有多少个   count
            int count = 0;
            for(int i = 0; i < length; i++){
                if(nums[i] <= mid){     // 相当于给数组排序
                    count++;
                }
            }

            // 若Count》mid 则在左区间找重复数 [left,mid]
            if(count > mid){
                right = mid;
            }else {
                // [mid+1, right]
                left = mid + 1;
            }
        }
        return left;

    }
}

举报

相关推荐

0 条评论