打卡力扣题目十一

这篇具有很好参考价值的文章主要介绍了打卡力扣题目十一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#左耳听风 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] * n
    repeat_num = -1

    for 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] += 1
        else:
            count[num] = 1

    res = []
    repeat_num = None
    for num, occ in count.items():
        if occ % 2 == 1:
            if repeat_num is not None:
                return [repeat_num, num]
            repeat_num = num
        elif occ == 1:
            res.append(num)

    return [res[0], res[1]] if len(res) == 2 else []

 四、区别

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

 文章来源地址https://www.toymoban.com/news/detail-620749.html

到了这里,关于打卡力扣题目十一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 打卡力扣题目六

    #左耳听风 ARST 打卡活动重启# 目录  一、问题 二、解题方法 三、解题方法二  四、两个方法的区别  关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分

    2024年02月15日
    浏览(35)
  • 打卡一个力扣题目

    目录 一、问题 二、解题办法一 三、解题方法二 四、对比分析 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享一篇有观点和思考的技术文章 希望通

    2024年02月15日
    浏览(34)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(45)
  • 算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

    Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字  大佬视频讲解:单调递增的数字视频讲解  个人思路 这个题目就是从例子中找规律,例如 332,从后往前遍历,32不是单调递增将2变为9,3减1,变成了329,遍历到2,32不是递增,将2变为9,3减1,变成299,符合题目条件,打印

    2024年04月16日
    浏览(44)
  • 算法打卡day49|动态规划篇17| Leetcode 647. 回文子串、516.最长回文子序列

    Leetcode 647. 回文子串 题目链接:647. 回文子串 大佬视频讲解:647. 回文子串视频讲解  个人思路  这道题的dp数组有点难找到关联,以至于递归关系也不好找,所以看题解吧... 解法 动态规划 动规五部曲: 1.确定dp数组(dp table)以及下标的含义 一般在定义dp数组的时候 会根据题

    2024年04月22日
    浏览(46)
  • 算法打卡day39|动态规划篇07| Leetcode 70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数

    Leetcode 70. 爬楼梯(进阶版) 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,

    2024年04月14日
    浏览(65)
  • 力扣(LeetCode)算法_C++—— 快乐数

    编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是

    2024年02月09日
    浏览(38)
  • 算法学习——LeetCode力扣回溯篇2

    40. 组合总和 II - 力扣(LeetCode) 描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 示例 1: 输入: candidates = [10,1,2,7

    2024年02月20日
    浏览(35)
  • 算法修炼之路之双指针含多道leetcode 经典题目

    目录 前言  一:普通双指针 1.经典题目一  283移动0问题 分析 代码实现 2.经典题目二 1089复写0  分析 代码实现 二:解决成环类问题-快慢指针  经典例题一 202快乐数 分析  代码实现   三:左右相遇指针 经典例题一 11 盛最多水的容器 分析  代码实现    接下来的日子会顺

    2024年04月13日
    浏览(76)
  • 算法学习——LeetCode力扣字符串篇

    344. 反转字符串 - 力扣(LeetCode) 描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 示例 1: 输入:s = [“h”,“e”,“l”

    2024年02月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包