算法练习-二分法 LeetCode 287. 寻找重复数

今日感受:⛽️⛽️

题目描述:

LeetCode 287. 寻找重复数

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

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

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

 算法练习-二分法 LeetCode 287. 寻找重复数_第1张图片


解题代码:

class Solution {
    // 抽屉法
    public int findDuplicate(int[] nums) {

        int l = 1, r = nums.length -1;

        while(l (midIndex-l+1)){
                r = midIndex;
            }else{
                l = midIndex + 1;
            }

        }

        return r;
    }
}

解题思路:

(1)使用抽屉法

         一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。相当于一个抽屉放一个数,然后一定有一个抽屉放了重复的数,也就是说这个抽屉里放的数不只一个。

(2)采用二分法进行搜索

        1. 确定二分范围,所有数的范围在1 ~ n,数组nums有n+1 个数。所以 l = 1, r = nums.length -1。 

        2. 确定二分中点:midIndex = l + (r-l)/2;

        3. 此时遍历整个nums数组里面,值在l 到 midIndex 范围内数的个数,count++;

        4. 判断如果整个nums数组里面值在在l 到 midIndex 范围内数的个数,即count的值大于(midIndex-l+1),则说明这个重复的值在l 到 midIndex 的范围内,此时更新 r = midIndex; 否则说明重复的数在另一边,此时向右收缩,更新l = midIndex + 1;

        5. 当 l == r 时,确定到了唯一值,跳出循环,返回 r 值。


你可能感兴趣的:(数据算法练习,算法,leetcode)