LeetCode刷题笔记-287题寻找重复数

news2024/9/24 5:30:10

LeetCode 287 寻找重复数

难度:中等

题目:

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 105
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

我的简单思路:

class Solution {
    public int findDuplicate(int[] nums) {
        // 简单思路:遍历整个数组,取temp=nums[i],又遍历数组,如果nums[j]==temp&&i!=j,则说明这个temp重复
        // 时间复杂度O(n^2),空间复杂度O(1)
        for (int i = 0;i< nums.length;i++) {
            int temp = nums[i];
            for (int j = 0;j<nums.length;j++) {
                if (nums[j] == temp && i != j ) {
                    return temp;
                }
            }
        }
        // 无作用,仅为保持语法
        return 0;
    }
}

很明显,这样的时间复杂度会导致案例执行超出时间限制。

测试用例55是一个很大的数组,如何优化呢?

反思总结,一开始的思路简单,但是考虑O(1)的空间复杂度,理解的是只能用一个临时int变量,导致后续没有用hash表去解决这道题。

从Leetcode力扣 1-300题视频讲解合集|手画图解版+代码【持续更新ing】学习到这道题的两个解决方法:

哈希表

 用哈希表统计整数出现的次数,如果发现哈希表中的key已经存在了,说明这个key就是重复的整数。

 

class Solution {
    public int findDuplicate(int[] nums) {
        // 哈希表法
        if (nums == null || nums.length == 0) {
            return 0;
        }
        Map<Integer,Integer> count = new HashMap<>(nums.length);
        for (int num: nums) {
            if (count.containsKey(num)) {
                return num;
            }else {
                count.put(num,1);
            }
        }
        return 0;
    }
}

快慢指针

 

 

class Solution {
    public int findDuplicate(int[] nums) {
        // 快慢指针法
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int slow = 0,fast = 0;
        do{
            slow = nums[slow];
            fast = nums[nums[fast]];
        }while(slow !=fast);
        fast = 0;
        while (slow !=fast) {
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fpga开发--蜂鸣器发出连续不同的音调

描述 使用fpga蜂鸣器连续发出do&#xff0c;re&#xff0c;mi&#xff0c;fa&#xff0c;so&#xff0c;la&#xff0c;xi七个不同的音调&#xff0c;每个音调的持续时间为0.5s。 思路 采用状态机实现音调的转化&#xff0c;当do状态持续了0.5s之后转移到re状态&#xff0c;…

c语言位段知识详解

本篇文章带来位段相关知识详细讲解&#xff01; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#xff01;&#xff01; 目录 一.什么是…

【SpringCloud Alibaba】(五)服务雪崩与容错方案

在前面的文章中&#xff0c;我们实现了用户微服务、商品微服务和订单微服务之间的远程调用&#xff0c;并且实现了服务调用的负载均衡。 但是&#xff0c;现在系统中存在着一个很明显的问题&#xff1a;那就是如果系统的并发量上来后&#xff0c;系统并没有容错的能力&#xf…

Onetable:统一的表格式元数据表示

概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表&#xff0c;享受从云上查询引擎到顶级开源项目的原生性能优化。 在数据平台需求层次结构的基础上&#xff0c;存在摄取、存储、管理和转换数据的基本需求。 Onehouse 提供这种基础数据…

C++库封装JNI接口——实现java调用c++

1. JNI原理概述 通常为了更加灵活高效地实现计算逻辑&#xff0c;我们一般使用C/C实现&#xff0c;编译为动态库&#xff0c;并为其设置C接口和C接口。用C实现的一个库其实是一个或多个类的简单编译链接产物。然后暴露其实现类构造方法和纯虚接口类。这样就可以通过多态调用到…

获取各省人口排名数据

目录 一、目标网址 二、网址分析 2.1、获取并解析网页内容 2.2 两种获取方法 三、获取目标数据 四、代码附件 一、目标网址 目标网址&#xff1a;中国人口排名 省份 1.1 网址截图 二、网址分析 2.1、获取并解析网页内容 我们需要使用requests库获取网页&#xff0c;使用…

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试&#xff1a; 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…

多模态大模型(MLLM)之VisCPM:支持中文对话文图双向生成

2020 年 12 月发布的 CPM-1 是国内首个中文大模型 &#xff1b;2022 年 9 月发布的 CPM-Ant 仅微调 0.06% 参数就能超越全参数微调效果&#xff1b;2023 年 5 月发布的 WebCPM 是 中文首个基于搜索的问答开源模型。CPM-Bee 百亿大模型是团队最新发布的基座模型&#xff0c;中文…

基于springboot+mybatis+vue进销存管理信息系统

基于springbootmybatisvue进销存管理信息系统 一、系统介绍二、功能展示1.个人中心2.企业信息管理3.商品信息管理4.客户信息管理5.入库记录管理6.出库记录管理7.出库记录管理8.操作日志管理9.库存盘点管理 四、获取源码 一、系统介绍 系统主要功能&#xff1a; 普通用户&#…

为啥运营商现在严格规范网购流量卡的年龄了呢?20岁以下难了

本期知识点只讲流量卡&#xff0c;葫芦弟今天分享给大家手机流量卡开卡安全的问题。 很多朋友可能觉得电信诈骗离自己很远&#xff0c;但实际上现在已经出现大量收购电话卡用于诈骗的现象&#xff0c;而我们很可能在不知不觉中掉进犯罪分子的陷阱&#xff0c;触犯法律&#xff…

关于element ui 安装失败的问题解决方法、查看是否安装成功及如何引入

Vue2引入 执行npm i element-ui -S报错 原因&#xff1a;npm版本太高 报错信息&#xff1a; 解决办法&#xff1a; 使用命令&#xff1a; npm install --legacy-peer-deps element-ui --save 引入&#xff1a; 在main.js文件中引入 //引入Vue import Vue from vue; //引入…

C# Solidworks二次开发:自动创建虚拟零件及使用注意事项

今天要讲的是关于在solidworks中如何自动创建虚拟零件的功能&#xff0c;也就是solidworks中插入新零件这个功能。 实现这个功能需要使用的API如下所示&#xff1a; InsertNewVirtualPart&#xff08;swFaceOrPlane1, out swcomp2&#xff09;&#xff1b; 其中这个方法中使…

【动态规划part11】| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 &#x1f388;LeetCode123.买卖股票的最佳时机III &#x1f388;LeetCode188.买卖股票的最佳时机IV &#x1f388;LeetCode123.买卖股票的最佳时机III 链接&#xff1a;123.买卖股票的最佳时机III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i…

X99双路主机28核56线程电脑配置选购与系统装机详细流程(附带资源)

文章目录 前期调研&#xff08;包含配件详细信息&#xff09;装机过程推荐学习视频实践过程 系统装机&#xff08;含资源详细过程&#xff09;提前准备&#xff08;制作系统盘工具以及ISO系统镜像&#xff09;实践过程步骤一&#xff1a;使用Rufsus工具&#xff0c;选择ISO文件…

记一次 .NET 某设备监控系统 死锁分析

一&#xff1a;背景 1. 讲故事 上周看了一位训练营朋友的dump&#xff0c;据朋友说他的程序卡死了&#xff0c;看完之后发现是一例经典的死锁问题&#xff0c;蛮有意思&#xff0c;这个案例算是学习 .NET高级调试 入门级的案例&#xff0c;这里和大家分享一下。 二&#xff…

【原理图专题】OrCAD Capture原理图设计差异对比

在我们进行硬件设计时,往往会遇到项目上的变更。比如更换了替代料、电路错误、新需求等等,这些有的需要动用到原理图,而动到原理图往往很容易出错,特别是已经量产的产品,我们可以通过BOM对比等方式来查看变更。那是否有一种其他方式能直接进行原理图对比呢? 其中对比功能…

桥接模式——处理多维度变化

1、简介 1.1、概述 桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度&#xff0c;通过该模式可以将这两个维度分离出来&#xff0c;使两者可以独立扩展&#xff0c;让系统更加符合单一职责原则。与多层继承方案不同&#xff0c;它将两个独…

【Linux】更换jdk版本

目录 一、前言二、查看jdk版本号1、项目中的版本号&#xff08;pom.xml&#xff09;2、服务器中的版本号 三、更换jdk版本1、创建java文件夹2、下载并解压JDK安装包①、下载jdk安装包②、移动到创建好的/usr/local/java路径下③、解压jdk安装包 四、删除原来的jdk版本1、删除原…

Java虚拟机——线程安全与锁优化

1 线程安全 当多个线程同时访问一个对象时&#xff0c;如果不用考虑这些线程在运行时环境下的调度和交替执行&#xff0c;也不需要进行额外的同步&#xff0c;或者在调用方进行任何其他的协调操作。调用这个对象的行为都可以获得安全的结果&#xff0c;就称这个对象是线程安全…

从零开始理解Linux中断架构(23)中断运行临界区和占先调度

Linux在内核中定义了6种运行临界区。 in_interrupt in_interrupt在驱动中使用频率最高的函数了,in_interrupt()就是指示Core是否正在中断处理中,包含了硬中断,软中断运行临界区。如果在中断处理中,则不能调用__do_softirq执行软中断处理。硬中断中不可调度不可中断,所有…