LeetCode hot100-100

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

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

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
java 复制代码
对数字范围 [1, n] 进行二分,而不是对数组本身排序。
统计数组中小于等于中间值 mid 的数字个数:
如果个数超过 mid,说明重复数字在 [1, mid] 范围内。
否则,重复数字在 [mid + 1, n] 范围内。

这题要领悟这个思想,所以起始是从1到n-1找的。因为有n个数,不重复的数就是1到n-1,重复了一个数之后才有的n个数。后面代码中的各种等号,right=mid,这跟传统二分还是不太一样,就是要理解上面的解法才知道为什么这样写。

java 复制代码
class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;
        int left = 1, right = n - 1;
        while (left < right) {
            int count = 0;
            int mid = (left + right) / 2;
            for (int num : nums) {
                if (num <= mid) {
                    count++;
                }
            }
            if (count > mid) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}
相关推荐
智者知已应修善业10 分钟前
【删除有序数组中的重复项 II之O(N)算法】2024-1-31
c语言·c++·经验分享·笔记·算法
patrickpdx19 分钟前
leetcode:环形链表
算法·leetcode·链表
资深web全栈开发20 分钟前
LeetCode 3652: 按策略买卖股票的最佳时机
算法·leetcode·职场和发展
Wang ruoxi30 分钟前
基于最小二乘法的离散数据拟合
人工智能·算法·机器学习
Xの哲學34 分钟前
Linux链路聚合深度解析: 从概念到内核实现
linux·服务器·算法·架构·边缘计算
加成BUFF39 分钟前
C++入门讲解3:数组与指针全面详解
开发语言·c++·算法·指针·数组
代码游侠1 小时前
应用——管道与文件描述符
linux·服务器·c语言·学习·算法
一招定胜负1 小时前
决策树开篇
算法·决策树·机器学习
GoWjw1 小时前
C语言高级特性
c语言·开发语言·算法
carver w1 小时前
说人话版 K-means 解析
算法·机器学习·kmeans