查找2
1. 两数之和
简单题
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
1 | 给定 nums = [2, 7, 11, 15], target = 9 |
暴力法O(N^2)
1 | def twoSum(self, nums: List[int], target: int) -> List[int]: |
使用哈希表
1 | def twoSum(self, nums: List[int], target: int) -> List[int]: |
如果返回的不是键值,而是对应的结果,可以用
排序+双指针
首先可以先排序,此时的数组是从小到大的,使用两个指针,分别从前后两个方向上去找
单步:
- 前指针的数值求补数,直到后指针找到
- 找到以后,前指针向后,后指针向前
- 如果发现数值已经大于该数字,结束后指针查找,重新开始前指针后移
15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
此题虽然合上述的问题相似,但是没有利用哈希表来做了,因为哈希表利用了哈希的程序便利性,使用排序加双指针会更好
- 首先求的和是0,当从小到大排序完成后,第一个数字必须是小于0的,如果大于0说明已经结束了
- 此时双指针一个从上一个循环的值开始(pre),一个从数组尾端开始(end)
- 两个while 同时逼近,target = -nums[i] - nums[pre]首先先动后面的,如果小于taget,跳出,前指针后移,如果大于,后指针前移查找直到相等,或者前后指针相同
1 | def threeSum(self, nums: List[int]) -> List[List[int]]: |
16. 最接近的三数之和
1 | 输入:nums = [-1,2,1,-4], target = 1 |
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案
- 先排序,第一个是最小的i,
- 然后往后查找,如果三个数字和等于target就返回,如果大于,说明可以end调小一点, 如果小于说明可以pre调大一点
- 每一次运算完检测差的绝对值是否变小了,如果变小了就记录当前的总和
1 | def threeSumClosest(self, nums: List[int], target: int) -> int: |
92 ms, 在所有 Python3 提交中击败了94.96%的用户
18. 四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
1 | 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 |
和三数字之和很类似,应该是在之前的上面增加一个循环
由于输出的是数字组合,用排序和双指针实现,首先是排序,确定第一个最小的值,然后确定第二小的值,剩下两个双指针走
1 | def fourSum(self, nums: List[int], target: int) -> List[List[int]]: |
由于是N^3的复杂度,速度还是很慢的,可以提前考虑一些极端情况优化下