两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们。
1. 两数之和
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:record = dict()for i, num in enumerate(nums):if target - num in record:return [record[target - num], i]else:record[num] = i
最直接的思路是用哈希表,把出现过的数字(及其索引下标)都用哈希表记录下来,这样每当遍历新的数字,就能快速找出 target - num 是否出现过,若是则返回下标。
170. 两数之和 III - 数据结构设计
class TwoSum:def __init__(self):self.record = dict()def add(self, number: int) -> None:if number in self.record:self.record[number] += 1else:self.record[number] = 1def find(self, value: int) -> bool:for num in self.record.keys():if value - num != num:if value - num in self.record:return Trueelif self.record[num] > 1:return Truereturn False
这题是不断地向数组添加数字,同时得能够检查数字是否为数组中某两个数字之和,思路还是哈希表,每当要对数字进行检查时,这个数字就相当于 target,遍历数组中的数字 num,找到 target - num 是否也在数组中即可。要注意的是可能出现 target - num 等于 num 的情况,而这种情况得 num 出现过两次才能返回 True,所以要用字典统计 num 出现的次数。
167. 两数之和 II - 输入有序数组
class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:n = len(numbers)left = 0right = n - 1while left < right:total = numbers[left] + numbers[right]if total > target:right -= 1elif total < target:left += 1else:return [left+1, right+1]
相较于上一题,这题的条件是数组已经按非递减顺序排列,这其实也给了我们一个新的思路,因为有序数组总是与双指针联系在一起。所以说,这题我们可以使用左右双指针 left 与 right,当两数之和大于 target 时右指针左移,当两数之和小于 target 时左指针右移,正好等于 target 时返回答案(注意下标从 1 开始)。
15. 三数之和
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:ans = []n = len(nums)nums.sort()for i in range(n):# 除了首位置之外,如果有多个重复的 nums[i],那就只考虑最后一个if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = n - 1while left < right:total = nums[i] + nums[left] + nums[right]# total 太大,右指针左移if total > 0:right -= 1# total 太小,左指针右移elif total < 0:left += 1else:# total 符合条件ans.append([nums[i], nums[left], nums[right]])# 避免 left + 1 与 left 一样while left < right and nums[left] == nums[left + 1]: left += 1# 避免 right - 1 与 right 一样while left < right and nums[right] == nums[right - 1]: right -= 1# 确保了不会出现重复的答案left += 1right -= 1return ans
从上一题得到的灵感,就是可以将数组排序然后用双指针解法,这对于三数、四数甚至更高的数之和都是适用的。在本题中,我们首先遍历并固定第一个下标 i,然后对它后面的区域进行双指针查找。由于不能出现重复的三元组,所以去重点有两个:
1、除了第一个位置以外,凡是 nums[i] == nums[i-1]
的,就说明 i 这个位置的数与上一个位置的重复了,直接考虑 i + 1。如果用的是 nums[i] == nums[i+1]
判断,就会把如 (-1, -1, 2) 这样的答案给忽略掉。
2、每当找到一个答案以后,left 和 right 指针都要移动,而它们应该跳过与当前位置数字相同的位置,避免出现重复的三元组。
18. 四数之和
class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:ans = []nums.sort()n = len(nums)for i in range(n):if i > 0 and nums[i] == nums[i-1]:continuefor j in range(i+1, n):if j > i+1 and nums[j] == nums[j-1]:continueleft = j + 1right = n - 1while left < right:total = nums[i] + nums[j] + nums[left] + nums[right]if total > target:right -= 1elif total < target:left += 1else:ans.append([nums[i], nums[j], nums[left], nums[right]])while left < right and nums[left] == nums[left+1]:left += 1while left < right and nums[right] == nums[right-1]:right -= 1left += 1right -= 1return ans
与三数之和相比,仅仅是多遍历了一个 j,注意 j 的位置是从 i + 1 开始的,所以它的去重是 if j > i+1 and nums[j] == nums[j-1]:
两数、三数、四数之和相关题目(Leetcode题解-Python语言)相关推荐
- 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)
在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...
- 快速幂算法相关题目(Leetcode题解-Python语言)
50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...
- 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...
- 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)
297. 二叉树的序列化与反序列化(剑指 Offer 37. 序列化二叉树)(剑指 Offer II 048. 序列化与反序列化二叉树) class Codec:def serialize(self, ...
- 二数和,三数和,四数和的优化总结
1.你以为很简单的两数之和 leetcode上你只用输出一组就好了, 但如果有重复数字呢? 比如 [1,2,2,3], target = 4 这个时候有两组解 [1,3], [2, 2] 如果给出的测 ...
- 历嫁两姓三辈四任可汗的大唐公主
在历史上,每一位远嫁外番的汉族公主,除了要担负起朝廷赋予的安邦重任外,还必须要经受住异国风俗的挑战.语言不通.水土不服,她们可以渐次学会,逐步适应;而身体要被几个男人们轮番占有规矩,可不像学发音.穿兽 ...
- 【金三银四】java是世界上最好的语言
Dubbo面试专题 JVM面试专题 Java并发面试专题 Kafka面试专题 MongDB面试专题 MyBatis面试专题 MySQL面试专题 Netty面试专题 RabbitMQ面试专题 Redis ...
- (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和
代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...
- 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
454. 四数相加 II 题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= ...
最新文章
- 2022-2028年中国房地产金融行业投资分析及前景预测报告
- 【逆向】UE4 渲染流程分析
- Mingw-W64编译Windows程序提示:undefined reference to `__imp_GetStockObject' 的解决方法
- Diffie-Hellman密钥交换协议
- Python数据分析pandas之分组统计透视表
- mysql日期条件如何应用_MySQL如何使用时间作为判断条件
- 格力关联公司公开“菜谱的推荐方法”相关专利
- 工程计算软件_软件工程师的计算机基础理论知识体系
- [转载] python isinstance()方法的使用
- 社区管理系统案列/APP/小程序/网站
- 【AD封装】TF(micro SD)卡座封装大全(带3D)
- meshlab点云转mesh
- 测试计划、测试方案、测试策略的区别
- unity 是厘米还是米_cm是厘米还是毫米
- iOS本机号码一键登录
- ASUS ZenBook Duo 14 UX481电脑 Hackintosh 黑苹果efi引导文件
- 数据库设计之商品表分析2
- Computational Intelligence Assisted Design -- In Industrial Revolution 4.0 (计算智能在工业4.0的应用) --绪论
- selenium爬堆糖网壁纸
- 受疫情影响,超七成美国科技公司暂停招聘或裁员
热门文章
- html jQuery/bootstrap通过网络bootcdn导入连接
- ArcGIS 10.2数字化线状要素时自动拼接成一条线
- Android之提示androidx.recyclerview.widget.LinearLayoutManager@51ddcd is already attached to a RecyclerV
- 微软官方pe工具_微软官方下载工具
- 华为手机Android系统优缺点,第一次安卓机优缺点总结(对比iOS系统)
- 真正拉开人与人之间的差距是什么?
- 谁还没个黑历史了。。。 | 今日最佳
- 人工智能时代,学好数学有什么用?
- 自从我上了数据结构课之后……
- TED演讲:区块链将如何改变世界?看完太震撼了!