作为 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语言)相关推荐

  1. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)

    在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...

  2. 快速幂算法相关题目(Leetcode题解-Python语言)

    50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...

  3. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)

    236. 二叉树的最近公共祖先 class Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'T ...

  4. 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)

    297. 二叉树的序列化与反序列化(剑指 Offer 37. 序列化二叉树)(剑指 Offer II 048. 序列化与反序列化二叉树) class Codec:def serialize(self, ...

  5. 二数和,三数和,四数和的优化总结

    1.你以为很简单的两数之和 leetcode上你只用输出一组就好了, 但如果有重复数字呢? 比如 [1,2,2,3], target = 4 这个时候有两组解 [1,3], [2, 2] 如果给出的测 ...

  6. 历嫁两姓三辈四任可汗的大唐公主

    在历史上,每一位远嫁外番的汉族公主,除了要担负起朝廷赋予的安邦重任外,还必须要经受住异国风俗的挑战.语言不通.水土不服,她们可以渐次学会,逐步适应;而身体要被几个男人们轮番占有规矩,可不像学发音.穿兽 ...

  7. 【金三银四】java是世界上最好的语言

    Dubbo面试专题 JVM面试专题 Java并发面试专题 Kafka面试专题 MongDB面试专题 MyBatis面试专题 MySQL面试专题 Netty面试专题 RabbitMQ面试专题 Redis ...

  8. (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和

    代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...

  9. 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和

    454. 四数相加 II 题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= ...

最新文章

  1. 2022-2028年中国房地产金融行业投资分析及前景预测报告
  2. 【逆向】UE4 渲染流程分析
  3. Mingw-W64编译Windows程序提示:undefined reference to `__imp_GetStockObject' 的解决方法
  4. Diffie-Hellman密钥交换协议
  5. Python数据分析pandas之分组统计透视表
  6. mysql日期条件如何应用_MySQL如何使用时间作为判断条件
  7. 格力关联公司公开“菜谱的推荐方法”相关专利
  8. 工程计算软件_软件工程师的计算机基础理论知识体系
  9. [转载] python isinstance()方法的使用
  10. 社区管理系统案列/APP/小程序/网站
  11. 【AD封装】TF(micro SD)卡座封装大全(带3D)
  12. meshlab点云转mesh
  13. 测试计划、测试方案、测试策略的区别
  14. unity 是厘米还是米_cm是厘米还是毫米
  15. iOS本机号码一键登录
  16. ASUS ZenBook Duo 14 UX481电脑 Hackintosh 黑苹果efi引导文件
  17. 数据库设计之商品表分析2
  18. Computational Intelligence Assisted Design -- In Industrial Revolution 4.0 (计算智能在工业4.0的应用) --绪论
  19. selenium爬堆糖网壁纸
  20. 受疫情影响,超七成美国科技公司暂停招聘或裁员

热门文章

  1. html jQuery/bootstrap通过网络bootcdn导入连接
  2. ArcGIS 10.2数字化线状要素时自动拼接成一条线
  3. Android之提示androidx.recyclerview.widget.LinearLayoutManager@51ddcd is already attached to a RecyclerV
  4. 微软官方pe工具_微软官方下载工具
  5. 华为手机Android系统优缺点,第一次安卓机优缺点总结(对比iOS系统)
  6. 真正拉开人与人之间的差距是什么?
  7. 谁还没个黑历史了。。。 | 今日最佳
  8. 人工智能时代,学好数学有什么用?
  9. 自从我上了数据结构课之后……
  10. TED演讲:区块链将如何改变世界?看完太震撼了!