1.两数之和:
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
思考:
- 数组无序,双指针不好解决。如果是有序数组,可以采用首尾双指针。
- 辅助哈希表(空间换时间)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int other = target - nums[i];
if (map.containsKey(other)) {
return new int[] { map.get(other), i };
}
map.put(nums[i], i); //将值及其下标放入map
}
throw new IllegalArgumentException("No two sum solution");
}
}
2、三数之和
- 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?请你找出所有满足条件且不重复的三元组。
- 注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
思考:
- 排序+双指针
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n=len(nums)
res=[]
if(not nums or n<3): #考虑特殊情况
return []
nums.sort()
for i in range(n):
if(nums[i]>0):
return res
if(i>0 and nums[i]==nums[i-1]):
continue
L=i+1 #双指针
R=n-1 #双指针
while(L<R):
if(nums[i]+nums[L]+nums[R]==0): #找到目标解
res.append([nums[i],nums[L],nums[R]])
while(L<R and nums[L]==nums[L+1]): #去除重复解
L=L+1
while(L<R and nums[R]==nums[R-1]):#去除重复解
R=R-1
L=L+1
R=R-1
elif(nums[i]+nums[L]+nums[R]>0): #过大,移动右指针
R=R-1
else: #过小,移动左指针
L=L+1
return res