• [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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    • 若是没有空间复杂度要求,直接用HashMap
    • 是特别的使用二分的一个题
    • 由闭区间考虑出发,代码需要结合实际情况判断是否是=,是否-1,具体见代码注释。

    代码

    class Solution {
    	public int findDuplicate(int[] nums) {
    		int l = 1; // l r mid 不再代表索引 而是元素值
    		int r = nums.length - 1;// 本质是对数组1 2 3 ... n进行二分
    		while (l < r) { // 为了最终锁定重复元素
    			int mid = l + (r - l) / 2;
    
    			int cnt = 0;
    			for (int num : nums) {
    				if (num <= mid) {
    					cnt++;
    				}
    			}
    
    			if (cnt <= mid) { // 重复的数可能重复多次,所以其他元素次数也可能为0
    				l = mid + 1;
    			} else {
    				r = mid; // 结合实际意义可得
    			}
    		}
    		return l;
    	}
    }
    
  • 相关阅读:
    Fire
    Apple Tree
    访问艺术馆
    三角关系
    字母表
    折纸
    旅行
    单词分类

    圆桌游戏
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12289453.html
Copyright © 2020-2023  润新知