【专题】寻找缺失/重复/只出现一次的数

本文介绍了多个LeetCode和剑指Offer中的编程问题,涉及寻找缺失、重复以及只出现一次的数字。通过位运算、求和、哈希表等方法,给出了解决这些问题的高效算法,要求在限定的时间和空间复杂度内完成。
摘要由CSDN通过智能技术生成

目录

LeetCode 41. 缺失的第一个正数

LeetCode 268. 0-n中缺失的一个数字 (Easy)

LeetCode 268变形:1-n中重复出现的一个数字 (重复出现2次) (Easy)

LeetCode 287. 1-n中重复出现的一个数字 (可能重复多次)

LeetCode 448. 找到所有缺失的数字

LeetCode 442. 找到所有重复两次的数字

LeetCode 645. 有一个数缺失,有一个数重复

LeetCode 136. 只出现一次的数字 (其他数均出现2次)

LeetCode 137. 只出现一次的数字II (其他数均出现3次)

LeetCode 260. 只出现一次的数字III (有2个数只出现一次)

LeetCode 387/剑指 35. 第一个只出现一次的字符 (Easy)

剑指 55. 字符流中第一个不重复的字符


LeetCode 41. 缺失的第一个正数

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

要求时间O(n),空间O(1)。

输入: [1,2,0]             输出: 3
输入: [3,4,-1,1]         输出: 2
输入: [7,8,9,11,12]    输出: 1

 

LeetCode 268. 0-n中缺失的一个数字 (Easy)

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

要求时间O(n),空间O(1)。

输入: [3,0,1]                    输出: 2
输入: [9,6,4,2,3,5,7,0,1]  输出: 8

思路: 

方法一:求和。n(n+1)/2 - sum(nums)即为缺失的那个数。该方法最简单,但可能会溢出。

方法二:位运算。这n个数和 0~n 组成2n+1个数,其中每个数值都出现了2次,只有一个数只出现了1次,即缺失的那个数。

 

LeetCode 268变形:1-n中重复出现的一个数字 (重复出现2次) (Easy)

给定一个范围在[1, n] 的 n+1 个数的序列,只有一个数出现了两次,找出这个数。

思路:和上题类似。

方法一:求和。重复的那个数 = sum(nums) - n(n+1)/2。该方法最简单,但可能会溢出。

方法二:位运算。这n+1个数和 1~n 组成2n+1个数,其中每个数值都出现了2次,只有一个数只出现了3次,即要找的那个数。

注意:这题(只重复2次)和下面287题(可能重复多次)不同。

 

LeetCode 287. 1-n中重复出现的一个数字 (可能重复多次)

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

说明:

不能更改原数组(假设数组是只读的)。
要求时间复杂度小于 O(n^2) ,空间O(1)
数组中只有一个重复的数字,但它可能不止重复出现一次

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

思路

方法1:先将数组排序, 然后遍历数组,比较相邻元素即可。时间O(nlgn), 空间O(1)。但该方法改变了原数组,不符合要求。

方法2:哈希表, 时间O(n), 空间O(n)。空间复杂度不

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值