LeetCode第五天(442. 数组中重复的数据)

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

class Solution {public List<Integer> findDuplicates(int[] nums) {//思路:遍历数组,每个数-1再取模,找出真实位置,再加上数组的长度,放进数组真实的位置上//再遍历,发现数组中元素大于2倍数组长度时,将其下标+1添加进返回结果的数组int len = nums.length;for(int num : nums){//找出真实位置int x = (num - 1) % len;//加上数组长度nums[x] += len; }//创建返回结果的数组List<Integer> ret = new ArrayList<Integer>();//遍历数组,找出数组中元素大于2倍数组长度的值for(int i = 0;i < len;i++){if(nums[i] > len * 2){ret.add(i+1);}}return ret;}
}

官解:

方法一:将元素交换到对应的位置
思路与算法

由于给定的 n个数都在 [1,n]的范围内,如果有数字出现了两次,就意味着 [1,n] 中有数字没有出现过。

因此,我们可以尝试将每一个数放在对应的位置。由于数组的下标范围是 [0,n−1],我们需要将数 i 放在数组中下标为 i−1 的位置:

如果 i 恰好出现了一次,那么将 iii 放在数组中下标为 i−1 的位置即可;
如果 i 出现了两次,那么我们希望其中的一个 i 放在数组下标中为 i−1 的位置,另一个 i 放置在任意「不冲突」的位置 j。也就是说,数 j+1 没有在数组中出现过。
这样一来,如果我们按照上述的规则放置每一个数,那么我们只需要对数组进行一次遍历。当遍历到位置 i时,如果 nums[i]−1≠i,说明 nums[i]出现了两次(另一次出现在位置 num[i]−1),我们就可以将 num[i]\textit{num}[i]num[i] 放入答案。

放置的方法也很直观:我们对数组进行一次遍历。当遍历到位置 iii 时,我们知道 nums[i]应该被放在位置 nums[i]−1。因此我们交换 num[i]和 nums[nums[i]−1] 即可,直到待交换的两个元素相等为止。

class Solution {public List<Integer> findDuplicates(int[] nums) {int n = nums.length;for (int i = 0; i < n; ++i) {while (nums[i] != nums[nums[i] - 1]) {swap(nums, i, nums[i] - 1);}}List<Integer> ans = new ArrayList<Integer>();for (int i = 0; i < n; ++i) {if (nums[i] - 1 != i) {ans.add(nums[i]);}}return ans;}public void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

方法二:使用正负号作为标记
思路与算法

我们也可以给 nums[i]加上「负号」表示数 i+1已经出现过一次。具体地,我们首先对数组进行一次遍历。当遍历到位置 iii 时,我们考虑 nums[nums[i]−1]的正负性:

如果 nums[nums[i]−1] 是正数,说明 nums[i]还没有出现过,我们将 nums[nums[i]−1] 加上负号;

如果 nums[nums[i]−1]是负数,说明 nums[i]已经出现过一次,我们将 nums[i]放入答案。

细节

由于 nums[i] 本身可能已经为负数,因此在将nums[i] 作为下标或者放入答案时,需要取绝对值。

class Solution {public List<Integer> findDuplicates(int[] nums) {int n = nums.length;List<Integer> ans = new ArrayList<Integer>();for (int i = 0; i < n; ++i) {int x = Math.abs(nums[i]);if (nums[x - 1] > 0) {nums[x - 1] = -nums[x - 1];} else {ans.add(x);}}return ans;}
}

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

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

相关文章

C语言程序编译和链接

翻译环境和运行环境 我们程序员天天要写代码&#xff0c;那我们天天写的代码是什么呢&#xff1f;我们写的其实莫过于是一些test.c文件和test.h这样的文件。都是一些文本信息&#xff0c;这些如果直接交给机器去处理机器是看不懂的&#xff0c;就像我们和外国人语言不通一样&…

vue中src目录下views和components

在Vue项目中&#xff0c;src目录是项目的主要工作目录&#xff0c;其中包含项目的源代码。views和components是src目录下的两个重要子目录&#xff1a; views目录&#xff1a; views目录主要用于存放页面级别的Vue组件。这些组件通常与路由相对应&#xff0c;每个组件代表一个…

【LeetCode】21. 合并两个有序链表(Java自用版)

递归&#xff1a; 以下是使用递归方式实现的完整Java代码&#xff0c;用于将两个升序链表合并为一个新的升序链表&#xff1a; class ListNode {int val;ListNode next;ListNode(int x) { val x; } }class Solution {public ListNode mergeTwoLists(ListNode list1, ListNod…

团体程序设计天梯赛 L2-029 特立独行的幸福

L2-029 特立独行的幸福 分数 25 对一个十进制数的各位数字做一次平方和&#xff0c;称作一次迭代。如果一个十进制数能通过若干次迭代得到 1&#xff0c;就称该数为幸福数。1 是一个幸福数。此外&#xff0c;例如 19 经过 1 次迭代得到 82&#xff0c;2 次迭代后得到 68&…

如何使用ChatGPT准备即将到来的面试How to Use ChatGPT to Prepare for an Upcoming Interview

使用ChatGPT来准备即将到来的面试可以非常有帮助&#xff0c;因为它可以模拟真实的面试场景并提供反馈。以下是一些步骤和提示&#xff0c;说明如何利用ChatGPT进行面试准备&#xff1a; 研究职位和公司&#xff1a;在与ChatGPT对话之前&#xff0c;先对你申请的职位和公司进行…

物联网如何改善医疗保健服务和患者体验

物联网&#xff08;IoT&#xff09;在医疗保健领域的应用正在逐渐改变服务和患者体验的方式。通过物联网技术&#xff0c;医疗保健提供者能够实现更高效的患者管理、更精准的诊断以及更个性化的治疗方案。以下是物联网改善医疗保健服务和患者体验的几个方面&#xff1a; 远程监…

【计算机网络教程】(第六版)第2章课后习题答案

第二章 2-012-022-032-042-062-072-082-092-102-112-122-132-142-152-16 2-01 物理层要解决哪些问题&#xff1f;物理层的主要特点是什么&#xff1f; 答&#xff1a; 物理层要解决的主要问题&#xff1a; &#xff08;1&#xff09;物理层要尽可能地屏蔽掉物理设备和传输媒体&…

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…

JAVA面试大全之JVM和调休篇

目录 1、类加载机制 1.1、类加载的生命周期&#xff1f; 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制&#xff1f; 2、内存结构 2.1、说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f; 2.2…

深入理解SSL协议:从理论到实践(二)

前言 这是一篇关于SSL协议的技术文章&#xff0c;有理论知识&#xff0c;但又兼具一定的实战性&#xff0c;文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景&#xff0c;以及就https这种实际应用场景&#xff0c;又着重分享具体的工作原理以及如何实现https…

鸿蒙HarmonyOS应用开发之使用Node-API接口创建ArkTs运行时环境

场景介绍 开发者通过pthread_create创建新线程后&#xff0c;可以通过napi_create_ark_runtime来创建一个新的ArkTs基础运行时环境&#xff0c;并通过该运行时环境加载ArkTs模块&#xff0c;目前仅支持在ArkTs模块中使用console接口打印日志&#xff0c;使用timer定时器功能。…

气体间隙的击穿强度

本篇为本科课程《高电压工程基础》的笔记。 气体间隙的击穿电压难以精确计算。工程应用中&#xff0c;大多参照一些典型的击穿电压试验数据来选择绝缘距离&#xff0c;要求较高的情况下感召实际电极布置&#xff0c;用实验方法来确定击穿电压。 稳态电压下的击穿 直流与工频…

SQL数据插入详解:单行与多行数据添加指南

在SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;中&#xff0c;添加数据通常使用INSERT INTO语句。以下是如何使用INSERT INTO语句向数据库表中添加数据的详细步骤和示例。 基本语法 INSERT INTO table_name (column1, column2, column3,…

每天一个数据分析题(二百三十)

在神经网络的优化算法中&#xff0c;Adam优化算法是结合了哪两种优化技术的优点&#xff1f; A.动量 (Momentum) 和 Adagrad B.Nesterov 动量和 RMSprop C.RMSprop 和 动量 (Momentum) D.SGD 和 Nesterov 动量 题目来源于CDA模拟题库 点击此处获取答案

SpringBoot 多数据源及事务解决方案

1. 背景 一个主库和N个应用库的数据源&#xff0c;并且会同时操作主库和应用库的数据&#xff0c;需要解决以下两个问题&#xff1a; 如何动态管理多个数据源以及切换&#xff1f; 如何保证多数据源场景下的数据一致性(事务)&#xff1f; 本文主要探讨这两个问题的解决方案…

全量知识系统 详细设计 “祖传代码”之序 “元素周期表”(QA)之2

Q11.将三部分拿出来单独看一下&#xff1a;一、管理者-组传代码&#xff08;祖传--宝藏&#xff1a;源头上保证&#xff09;&#xff1a; 二、代理者-软件代理&#xff08;继承--差异&#xff1a;广度上扩展)。 三、提供者-AI组件&#xff08;遗传--对齐&#xff1a;强度上增强…

第4章树与二叉树

属于二叉树 跟链表的不同&#xff1a;每个节点可以指向多个节点 所以直接改变next[n]就好 链表是树形结构特例 树的深度(高度): 层数 5 [1 4 5 7 8] 节点深度&#xff1a;从根节点开始&#xff0c;4的深度&#xff1a;[1 4] 1 节点高度&#xff1a;从叶子节点开始&#xff0c;4…

数字化时代下的电子元器件商城模式创新

在数字化时代&#xff0c;电子元器件商城可以通过以下方式进行模式创新&#xff1a; 智能化搜索与推荐&#xff1a; 引入人工智能和机器学习技术&#xff0c;提供智能化搜索和个性化推荐功能&#xff0c;根据客户的需求和历史购买记录推荐相关的电子元器件&#xff0c;以提高购…

全国植被类型分布数据

引言 全国植被类型分布数据利用 Landsat 卫星数据&#xff08;Landsat TM&#xff0c;ETM和 OLI&#xff09;完成了长时序的地表覆盖变化检测&#xff0c;并结合变化 检测结果实现了逐区域和逐期的地表覆盖动态更新&#xff0c;30米精细植被类型分布数据&#xff0c;共包含 2…

Java 总结二

一、抽象类和接口 抽象类使用abstract修饰&#xff0c;不能实例化。抽象类中可以有零到多个抽象方法。抽象方法使用abstract关键字修饰&#xff0c;没有方法体。如果非抽象类继承抽象类&#xff0c;则必须实现父类的所有的抽象方法&#xff0c;否则子类还是一个抽象类。用fina…