剑指offer 2--数组中重复的元素

news2024/9/29 11:34:20

数组中重复的数字_牛客题霸_牛客网 (nowcoder.com)

【排序法】思路和代码:

  1. 对数组进行排序。
  2. 遍历排序后的数组,如果当前元素与下一个元素相等,则找到了重复数字,返回该数字。
  3. 如果遍历完数组都没有找到重复数字,则返回-1。

时间复杂度:O(nlogn) (取决于排序算法的复杂度) 空间复杂度:O(1)(原地排序,没有使用额外的空间)

int findDuplicate(vector<int>& nums) {
    sort(nums.begin(), nums.end());

    for (int i = 1; i < nums.size(); i++) {
        if (nums[i] == nums[i - 1]) {
            return nums[i];
        }
    }

    return -1;
}

【哈希表法】思路和代码:

  1. 创建一个哈希表(或者使用unordered_set),用于存储已经遍历过的数字。
  2. 遍历数组,对于每个数字,检查哈希表中是否已经存在该数字。
    • 如果存在,则找到了重复数字,返回该数字。
    • 如果不存在,则将该数字添加到哈希表中。
  3. 如果遍历完数组都没有找到重复数字,则返回-1。

时间复杂度:O(n) 空间复杂度:O(n)(存储哈希表的额外空间)

class Solution 
{
public:
    int duplicate(vector<int>& nums) 
    {
        // write code here
    unordered_set<int> seen;  // 创建一个哈希表用于存储已经遍历过的数字

    for (int num : nums) 
    {
        if (seen.count(num) > 0) 
        {  // 如果当前数字已经存在于哈希表中,即找到了重复数字
            return num;
        }
        seen.insert(num);  // 将当前数字添加到哈希表中
    }

    return -1;  // 数组中没有重复数字
    }
};

(最佳)【下标法】思路和代码:

该问题可以通过下标法来解决,通过对数组进行遍历,将数字按照其值与下标对应的关系进行交换,使得每个位置上的数字与其下标一致。当发现某个位置上的数字与下标不一致时,即找到了一个重复的数字。

具体步骤如下:

  1. 从头到尾依次扫描数组中的每个数字。
  2. 当扫描到下标为i的数字nums[i]时,首先判断nums[i]是否等于i。
    • 若相等,则继续扫描下一个数字。
    • 若不相等,则将nums[i]与nums[nums[i]]的数字进行交换,即将nums[i]放到正确的位置上。
  3. 交换后,再次判断当前位置上的数字nums[i]是否等于i。
    • 若相等,则继续扫描下一个数字。
    • 若不相等,则判断nums[i]与nums[nums[i]]的数字是否相等。
      • 若相等,则找到了重复数字nums[i],返回该数字。
      • 若不相等,则继续交换,重复步骤3。
  4. 如果遍历完数组都没有找到重复数字,则返回-1。

时间复杂度:O(n) 空间复杂度:O(1)(原地操作,没有使用额外的空间)

int findDuplicate(vector<int>& nums) {
    for (int i = 0; i < nums.size(); i++) {
        while (nums[i] != i) {  // 当前位置的数字与下标不一致时执行交换操作
            if (nums[i] == nums[nums[i]]) {  // 发现重复数字
                return nums[i];
            }
            // 交换当前位置的数字nums[i]与应该在该位置上的数字nums[nums[i]]
            swap(nums[i], nums[nums[i]]);
        }
    }

    return -1;  // 数组中没有重复数字
}

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

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

相关文章

ChatGPT应用组队学习来了!

Datawhale学习 联合主办&#xff1a;Datawhale、百度文心 Datawhale联合百度文心&#xff0c;五月为大家带来AIGC应用专题&#xff1a;大模型从入门到应用&#xff0c;学习大纲如下&#xff08;文末整理了这次学习的所有资料&#xff09;&#xff1a; 参与学习 ▶ 活动时间&am…

量子力学专题:线性谐振子

任何体系在平衡位置附近的小振动&#xff0c;例如 分子振动、晶格振动、原子核表面振动以及辐射场的振动等往往都可以分解成 若干彼此独立的一维简谐振动简谐振动往往还作为复杂运动的初步近似 见理论力学专题&#xff08;小振动&#xff09; 双原子分子&#xff0c;两原子间的…

kubernetes02

pod pod生命周期 pod的状态 1.挂起pending:API server创建了pod资源对象已存入etcd中&#xff0c;但它尚未被调度完成&#xff0c;或者仍处于从仓库下载镜像的过程中 2.运行中running:pod已经被调度到某节点&#xff0c;并且所有容器都已经被kubelet创建完成 3.成功complet:…

物业设备管理系统

物业服务质量难以保证&#xff0c;工单处理慢&#xff0c;巡检记录不规范&#xff1b;物业设备设施管理混乱&#xff0c;维修保养成本高&#xff0c;风险隐患多&#xff1b;物业数据分散&#xff0c;难以统计分析&#xff0c;无法提供决策支持&#xff1b;每天需要检查和保养的…

Hadoop学习---8、Hadoop数据压缩

1、Hadoop数据压缩 1.1 概述 1、压缩的好处和坏处 &#xff08;1&#xff09;优点&#xff1a;减少磁盘IO、减少磁盘储存空间 &#xff08;2&#xff09;缺点&#xff1a;增加CPU开销 2、压缩原则 &#xff08;1&#xff09;运算密集型的Job&#xff0c;少用压缩 &#xff08…

亚马逊云科技赋能中国出海企业创新及开拓海外业务

向全球价值链上游奋进 中国企业增强国际竞争力的关键&#xff0c;是努力朝全球价值链上游奋进&#xff0c;发力技术出海。中国的出海新机遇&#xff0c;背后曾是疫情在全球按下数字互联和数字化升级的快进键&#xff0c;跨境电商、在线社交、移动支付、数字服务等数字经济迎来…

【技巧】如何保护Word文档不被改动?

工作上&#xff0c;很多小伙伴需要将Word文档发给对方看&#xff0c;但又不想在传看时&#xff0c;被对方改动上面的内容。这种情况&#xff0c;我们可以通过以下两种方法&#xff0c;让Word文档不能改动。 首先&#xff0c;我们可以把Word文档设置限制编辑&#xff0c;被限制后…

FPGA采集CameraLink相机Full模式解码输出,附带工程源码和技术支持

目录 1、前言2、CameraLink协议基础3、目前我已有的CameraLink收发工程4、设计方案输入CameraLink相机视频缓存视频输出软件配置 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 FPGA实现CameraLink视频编解码目前有两种方案&#xff1a; 一是使…

美团面试:接口被恶意狂刷,怎么办?

如果Java接口被恶意狂刷&#xff0c;我们一般可以采取以下措施&#xff1a; 用TimeStamp &#xff08;兵不厌诈&#xff09; 比如给客户端提供一个timestamp参数&#xff0c;值是13位的毫秒级时间戳&#xff0c;可以在第12位或者13位做一个校验位&#xff0c;通过一定的算法给…

Docker实战2-发布后端Java项目

有了上篇Docker实战1-发布前端Vue项目的经验&#xff0c;发布后端就轻车熟路了。 1 准备文件 java打包 运行maven的package,生成jar文件&#xff0c;target/dsm-service-1.0-SNAPSHOT.jar DockerFile # Docker image for springboot file run FROM openjdk:11.0.11-jdk-sli…

【JavaSE】Java基础语法(十二):ArrayList

文章目录 1. ArrayList的构造方法和添加方法2. ArrayList类常用方法3. ArrayList存储学生对象并遍历 集合和数组的区别 : 共同点&#xff1a;都是存储数据的容器不同点&#xff1a;数组的容量是固定的&#xff0c;集合的容量是可变的 1. ArrayList的构造方法和添加方法 ArrayL…

2023亚马逊云科技游戏开发者大会从技术角度探索游戏的广阔边界

自上世纪五十年代诞生以来&#xff0c;电子游戏产业蓬勃发展&#xff0c;这与人类想象力的解放有着无比紧密地联系。伴随着全球游戏市场竞争的加剧&#xff0c;“游戏人”面临着很多全新的挑战。因此&#xff0c;2023亚马逊云科技游戏开发者大会不仅带来了最新的游戏行业举措&a…

基于多智能体深度强化学习的体系任务分配方法

源自&#xff1a;指挥与控制学报 作者&#xff1a;林萌龙, 陈涛, 任棒棒, 张萌萌, 陈洪辉 摘 要 1 背景 1.1 集中式决策VS分布式决策 图1集中式决策示意图 1.2 多智能体强化学习 2 问题描述 2.1 场景描述 图2分布式决策场景下的体系任务分配 2.2 状态空间、动作…

PyTorch-DataLoader

DataLoader&#xff1a;从Dataset中取数据&#xff0c;怎么取&#xff0c;每次取多少可以由DataLoader中的参数进行设定&#xff0c;并将数据加载到神经网络中。 dataloader.py import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard im…

Python框架比较:Django、Flask和Pyramid三者的优缺点和应用场景

第一章&#xff1a;引言 在当今快节奏的软件开发行业中&#xff0c;选择合适的开发框架对于开发人员来说至关重要。Python作为一种流行的编程语言&#xff0c;拥有众多强大的框架&#xff0c;其中包括Django、Flask和Pyramid。本文将比较这三个Python框架的优缺点和应用场景&a…

企业级低代码开发,迈向企业数字化时代

当下&#xff0c;随着科技的快速发展&#xff0c;软件开发的成本不断降低&#xff0c;越来越多的人可以参与到软件开发的过程中。但是在这个过程中&#xff0c;我们也发现了一个问题&#xff0c;就是软件开发的成本越来越高。传统的开发模式需要投入大量人力物力&#xff0c;而…

旅游信息推荐系统

文章目录 旅游信息推荐系统一、系统演示二、项目介绍三、系统运行界面图四、系统部分功能截图五、部分代码展示六、底部获取源码 旅游信息推荐系统 一、系统演示 旅游信息推荐系统 二、项目介绍 数据库版本&#xff1a; mysql8.0 数据库可视化工具&#xff1a; navicat 服务器…

新技术越来越多,作为程序员,我们应该怎么规划职业生涯? | 社区征文

随着科技的不断进步&#xff0c;新技术不断涌现&#xff0c;对程序员的要求也在不断提高。作为一名程序员&#xff0c;要想在这个竞争激烈的行业中立足&#xff0c;就需要制定一份明确的职业规划&#xff0c;不断学习和掌握新技术&#xff0c;提升自己的职业能力和竞争力。 确定…

自古以来,反射也是兵家必争之地

成文耗时1小时&#xff0c;阅读5min&#xff0c;有用指数5颗星。 这几天收到一个战术性需求&#xff0c;将一大坨字段序列化为特定格式的字符串。 大概是下表&#xff1a; 序号字段名描述是否必填0logVersion日志版本是1productName产品是2serviceName服务是.........25extend3…

手写Spring源码(简化版)

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式牛客面试题 参考视频&#xff1a; 周瑜大都督手写模拟Spring_哔哩哔哩 源码&#xff1a; https://gitee.com/vincewm/spring-master 目…