打卡力扣题目十一

news/2024/10/30 13:37:48/

#左耳听风 ARST 打卡活动重启#

目录

 一、问题

二、解题方法一

 三、解题方法二

 四、区别


 关于 ARTS 的释义 —— 每周完成一个 ARTS:
● Algorithm: 每周至少做一个 LeetCode 的算法题
● Review: 阅读并点评至少一篇英文技术文章
● Tips: 学习至少一个技术技巧
● Share: 分享一篇有观点和思考的技术文章

希望通过此次活动能聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。
 


 一、问题

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

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


示例 2:

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

提示:

2 <= nums.length <= 104
1 <= nums[i] <= 104

二、解题方法一

def findErrorNums(nums):n = len(nums)error_nums = [0] * nrepeat_num = -1for i in range(n):if nums[abs(nums[i]) - 1] > 0:error_nums[abs(nums[i]) - 1] = abs(nums[i])else:repeat_num = abs(nums[i])return [x for x in range(1, n + 1) if x not in error_nums] + [repeat_num]

这段代码实现了一个函数 `findErrorNums`,用于找出给定数组 `nums` 中重复出现的整数和丢失的整数,并将它们以数组的形式返回。

具体实现过程如下:

1. 首先定义一个长度为 `n` 的列表 `error_nums`,其中 `error_nums[i]` 表示在 `nums` 中第 `i` 个元素对应的错误数字。初始时,所有元素都设为 0。

2. 然后遍历整个数组 `nums`,依次判断每个元素是否出现了错误。如果某个元素的绝对值在 `nums` 中出现过,说明它出现了错误,将该元素的绝对值赋值给 `error_nums` 中对应位置的元素;否则,说明该元素是重复出现的数字,将其赋值给变量 `repeat_num`。

3. 最后,遍历从 1 到 `n` 的所有整数,如果某个整数不在 `error_nums` 中,说明它是正确的数字,将其加入结果数组中;否则,说明它是丢失的数字,将其加入结果数组中。

4. 返回结果数组即可。

总的来说,这段代码的时间复杂度为 O(n),空间复杂度为 O(n)。

 三、解题方法二

另一种解题方法是使用哈希表来记录每个数字出现的次数,然后遍历整个数组,找出重复出现的数字和丢失的数字。

具体实现过程如下:

1. 首先定义一个长度为 `n` 的列表 `nums`,其中 `nums[i]` 表示集合 S 中第 `i` 个元素。

2. 创建一个空的哈希表 `count`,用于记录每个数字出现的次数。

3. 遍历整个数组 `nums`,依次将每个数字加入哈希表中,并更新该数字的出现次数。如果某个数字已经在哈希表中出现过,说明它出现了两次,需要将其从哈希表中删除。

4. 遍历哈希表,找出出现次数为奇数的数字,即为重复出现的数字;遍历数组 `nums`,找出第一个不在哈希表中的数字,即为丢失的数字。

5. 将重复出现的数字和丢失的数字以数组的形式返回即可。

总的来说,这种方法的时间复杂度为 O(n),空间复杂度为 O(n)。

def findErrorNums(nums):count = {}for num in nums:if num in count:count[num] += 1else:count[num] = 1res = []repeat_num = Nonefor num, occ in count.items():if occ % 2 == 1:if repeat_num is not None:return [repeat_num, num]repeat_num = numelif occ == 1:res.append(num)return [res[0], res[1]] if len(res) == 2 else []

 四、区别

哈希表和双指针的区别在于,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表中有多少条数据,插入和查找的时间复杂度都是为O(1)。而双指针则是一种算法思想,它通过两个指针来遍历数组或链表,从而找到符合条件的元素。 

 


http://www.ppmy.cn/news/991446.html

相关文章

【多线程中的线程安全问题】线程互斥

1 &#x1f351;线程间的互斥相关背景概念&#x1f351; 先来看看一些基本概念&#xff1a; 1️⃣临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。2️⃣临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。3️⃣互斥&…

计算机中存储器的层次结构

现代的存储器体系结构是这样的&#xff1a; 越往上访问速度越快&#xff0c;更小&#xff0c;成本也越高。越往下访问速度越慢&#xff0c;更大&#xff0c;成本也越低。 在最高层&#xff08;L0&#xff09;是少量快速的CPU寄存器&#xff0c;CPU可以在一个时钟周期内访问他…

jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比

一、数据结构差别 1.7&#xff1a;数组链表 1.8&#xff1a;数组链表红黑树 当链表的长度大于8时&#xff0c;数组长度大于64&#xff0c;原来的链表数据结构变为红黑树 二、HashMap中的关键属性和方法区别 方法/变量/类 JDK7 JDK8 备注 DEFAULT_INITIAL_CAPACITY 16 16…

Git分布式版本控制工具和GitHub(一)--简介

一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git &#xff08;1&#xff09;版本控制 写代码就是不断写BUG的过程&#xff08;当然我们是不会这么说的&#xff09;&#xff0c;很多时候你写了100行代码之后&#xff0c;突然醒悟&…

SpringBoot月度员工绩效考核管理系统【附任务书|ppt|万字文档(LW)和搭建文档】

主要功能 员工登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、绩效指标管理、绩效考核管理 管理员登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、部门管理、岗位管理、员工管理、绩效指标…

Python责任链模式介绍、使用方法

一、Python责任链模式介绍 概念&#xff1a; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求从一个对象传递到另一个对象&#xff0c;直到请求被处理为止。在责任链模式中&#xff0c;多个对象组成一个链&am…

Java多线程(二)

目录 一、多进程 二、多线程 三、多线程与多进程的区别与联系 一、多进程 为了实现支持多个任务的系统&#xff0c;这里就设计了进程&#xff0c;用于实现并发编程的效果。由于进程需要频繁的创建和销毁&#xff0c;这里就导致了进程&#xff1a;消耗的资源多、速度慢。开销大主…

Linux近两年高危漏洞修复过程记录

一、背景 2023年8月份&#xff0c;面对即将到来的“大运会”、“亚运会”&#xff0c;今年的例行安全护网阶段也将迎来新的挑战和时刻&#xff0c;为此相关部门发布了国家级实战攻防演练已进入紧急「备战」时刻&#xff01;这里我们主要说一下Linux OS层面的漏洞处理&#xff0…