寻找重复数

2023-11-06

lettCode 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) 。
  • 数组中只有一个重复的数字,但它可能不止重复出现一次。

解法1:使用time数组计数

解题思路:

因为题目说明了nums[i]是处于1~n的,所以我们可以定义一个长度为n+1的数组,然后以nums[i]为下标来计数

class Solution {
    public int findDuplicate(int[] nums) {
        int[] times = new int[nums.length+1];
        for(int i=0; i<nums.length; i++)
        {
            if(times[nums[i]]!=0)
                return nums[i];
            times[nums[i]]++;
        }
        return 0;
    }
}

时间复杂度为O(n),只需要遍历一遍数组

空间复杂度为O(n+1), 不满足题意

虽然该解法通过了

解法2:二分查找

我们观察题目知道,给定的数组元素的大小为(1,n),数组的长度为n+1

根据抽屉原理

    抽屉原理:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放不少于两个苹果。

意思就是说,假如我们现在在区间(left,right)中找大于等于mid的元素的个数cnt,当cnt大于mid时。我们可以确定,重复的元素就处于(left,mid)中间

为什么呢?

因为根据抽屉原理,现在从left到mid中抽屉的个数就是mid-left,但是小于等于mid的元素的个数又大于mid,因此中间肯定有重复的元素,不然小于等于mid的元素个数就应该是mid-left个.

举个例子

[2,4,5,2,3,1,6,7]一共有8个数,所以里面的元素大小在区间(1,7)

现在二分查找该区间,中间数为4,如果小于等于4的元素个数大于4(1,2,2,3,4),说明重复的元素大小就在区间(1,4)中,然后再取中间数2,发现小于等于2的元素个数大于2(1,2,2),说明元素大小在区间(1,2)中,然后取中间数1,小于等于1的元素个数为1,因此区间为(2,2),最后我们就找到了重复的元素

代码如下:

public class Solution {

    public int findDuplicate(int[] nums) {
        int len = nums.length;
        int left = 1;
        int right = len - 1;
        while (left < right) {
            // 在 Java 里可以这么用,当 left + right 溢出的时候,无符号右移保证结果依然正确
            int mid = (left + right) >>> 1;
            
            int cnt = 0;
            for (int num : nums) {
                if (num <= mid) {
                    cnt += 1;
                }
            }

            // 根据抽屉原理,小于等于 4 的个数如果严格大于 4 个
            // 此时重复元素一定出现在 [1, 4] 区间里
            if (cnt > mid) {
                // 重复元素位于区间 [left, mid]
                right = mid;
            } else {
                // if 分析正确了以后,else 搜索的区间就是 if 的反面
                // [mid + 1, right]
                left = mid + 1;
            }
        }
        return left;
    }
}

解法来源

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/find-the-duplicate-number/solution/er-fen-fa-si-lu-ji-dai-ma-python-by-liweiwei1419/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找重复数 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项

随机推荐

  • 数字信号处理技术(二)变分模态分解(VMD)-Python代码

    本文仅对变分模态分解 VMD 的原理简单介绍和重点介绍模型的应用 1 VMD原理 变分模态分解 VMD 的原理在此不做详细介绍 推荐两个不错的解释参考连接 变分模态分解原理步骤 和VMD算法的介绍 官方源码 2 VMD应用实战 2 1 简介
  • AngularJS系列之JavaScript函数和对象

    转载请注明来源 http blog csdn net caoshiying viewmode contents 这篇文章针对的是有2年以上编程经验的朋友们参考的 作参考资料之用 不从基础讲起 在ES6之前 JavaScript没有class
  • Mybatis 入门

    1 Mybatis 项目构建 新建数据库 CREATE DATABASE mybatis USE mybatis DROP TABLE IF EXISTS user CREATE TABLE user id INT 20 NOT NULL
  • 多元共进|拓宽知识边界,持续增长技能

    在开放且迅速迭代的技术生态中 开发者面临着无限的机遇 与此同时 开发者的知识储备和技能水平也被赋予了更高的期待 2023 Google 开发者大会与开发者们共享了技术新知 也同步提供持续更新的学习资源 包括可以上手实践的课程和练习 加深开发
  • python+opencv+numpy入门

    一 简介 python是一门编程语言 由于其可以调用很多科学计算包 如numpy scipy matplotlib等而功能强大 numpy是python可调用的科学计算包 主要用于矩阵运算 它是python的数值计算扩展 这种工具可用来存储
  • STM32软件加密

    摘要 知识产权的保护 如何让自已辛勤的劳动成果不被别人抄袭 采用有效的手段对IC加密是值得每一个设计者关注的问题 当然 有人说 没有解不了密的IC 的确 解密是一项技术 只要有人类在不断的研究 它就有破解的一天 但是加密后的IC会增加破解的
  • 【数据库实验报告】关于SQL Server 简单的使用

    关于SQL Server 简单的使用 1 登陆SSMS 首先登陆 之前开启了sa账户 现在使用sa账户登陆 2 创建数据库 右键数据库 点击新建数据 输入数据库名称 然后确定 这个时候 已经新建了一个数据库了 现在在左侧管理器中 就可以看到
  • CaffeineCache基本使用 & SpringBoot集成缓存

    文章目录 一 常用API 1 get 2 getAll 3 refresh 二 缓存回收 清除 1 显式回收 2 隐式回收 2 1 基于容量 2 2 基于时间 2 3 基于引用 2 4 基于权重 三 刷新缓存 reload 四 监听器 五
  • 机房建设--服务器机柜尺寸参考

    自建或托管机房中常用的机柜规格为19英寸机柜 宽度 48 26cm 42U高度 1Unit 4 445cm 1 75英寸 选购需注意服务器机柜的进深通常为800mm 19英寸机柜尺度参考 称号 类型 规范尺度 mm 高 宽 深 备注 标准机
  • pktgen网络测试工具介绍

    pktgen是一款网络测试工具 可以用于压力测试 性能测试 负载均衡测试等方面 它使用Lua脚本来生成和发送数据包 并且支持多线程处理 pktgen可以在Linux系统上运行 支持多种协议和数据包类型 如TCP UDP ICMP ARP等
  • 砕月~イノチ~ - 小森きり

    From 我爱二次元 虾米电台 http www xiami com u 5627589 spm a1z1s 6626017 1561534497 3 3qsa0i Vocal 小森 Arranger 妄想放出所 haru 山野 原曲 砕月
  • 硬链接和软链接的区别和作用

    首先说说目录的本质和节点的概念 在linux系统下一切皆文件 目录它也是一个文件 只不过在它里面存储的是 一张表的文件 而节点就类似我们c语言中学过的数组的下标 我们可以把每个文件都看成是 数组中的元素 而知道了节点号 就可以找到实质的文件
  • office文档转pdf服务 本地或远程 OpenOffcie、LibreOffcie

    网上说 转的主流是 jacod和 aspose aspose是商用软件 跨平台 不需要第三方软件 jacod依赖 windows环境 在linux下需要安装openOffice 结果走了弯路 以为破解版的aspose好使 windows下好
  • 创业之初一般是怎么死的?写的非常好。。。。。

    转自 http xueyuan cyzone cn gushi ganwu 239865 html 我自己年轻的时候也创过业 条件很好 最后也失败了 后来做投资 看到的创业者就更多 最后发现自己有了丰富的创业失败经验 于是就比较适合写这篇创
  • Springcloud nacos install配置文件没有在target的classes里生成

    这是最近接手的一个springcloud的项目 在install编译的时候 target里面没有对应的nacos的配置文件 导致项目启动不起来 刚开始我也和大家一个都会搜索idea maven编译的时候install后target里面没有生
  • 数据结构——平衡树【2-3查找树、红黑树】

    查找树 查找树的定义 一棵标准的二叉查找树中的结点称为2 结点 含有一个键和两条链 而现在我们引入 3 结点 含有两个键和三条链 2 结点 含有一个键 及其对应的值 和两条链 左链接指向 2 3 树中的键都小于该结点 右链接指向的 2 3
  • ES 模糊查询 实现像Mysql like %%那样的模糊查询

    BoolQueryBuilder boolQueryBuilder QueryBuilders boolQuery WildcardQueryBuilder wildcardQueryBuilder QueryBuilders wildca
  • Javaweb基础-Servlet前后端交互

    eclipse创建好html文件和servlet之后得到如下页面 前端html 1 首先在html中引入Jquery 把下面的代码插入到head标签下 2 之后编写我们的前端html内容 在body标签内编写一下内容 用户名
  • http九大内置对象和四大作用域

    九大对象 application ServletContext 服务器启动后就产生了这个对象 所有客户共享这个内置的application 重中之中 request HttpServletRequest ServletResponse 封装
  • 寻找重复数

    lettCode 287 寻找重复数 给定一个包含 n 1 个整数的数组 nums 其数字都在 1 到 n 之间 包括 1 和 n 可知至少存在一个重复的整数 假设只有一个重复的整数 找出这个重复的数 示例 1 输入 1 3 4 2 2 输