给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
利用hash表,在迭代时,判断hash表中是否存在 target-num1这一元素,并同时将 num1 和 其索引 index1 分别作为key,value存入hash表中
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
map={}
for index1, num1 in enumerate(nums):
num2=target-num1
if (num2 in map):
return [index1,map.get(num2)]
map[num1]=index1
注意:此题不适合使用双指针,因为需要先对数组进行排序,而排序后,数组的下标会被打乱,结果要求返回的数字的下标
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
排序,固定一个数,双指针首尾遍历,注意去重
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n-2):
# 注意去重
if i > 0 and nums[i] == nums[i-1]:
continue
left = i + 1
right = n - 1
while left < right:
cur_sum = nums[i] + nums[left] + nums[right]
if cur_sum == 0:
tmp = [nums[i],nums[left],nums[right]]
res.append(tmp)
# 注意去重,必须要在比较和target相等之后再去重,否则类似[0,0,0][-2,1,1]这种包含重复元素的答案找不到
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
elif cur_sum > 0:
right -= 1
else:
left += 1
return res
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
与上一题一样,额外需要用一个变量diff保存距离,如果更近则更新结果 res
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
import sys
diff=sys.maxsize
res=0
nums.sort()
for i in range(len(nums)-2):
j=i+1
k=len(nums)-1
while j
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
排序,固定两个数,双指针首尾遍历,注意去重
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
ans=[]
for i in range(len(nums)-3):
# 注意去重的边界
if i > 0 and nums[i] == nums[i-1]:
continue
for j in range(i+1,len(nums)-2):#固定两个数
# 注意去重的边界
if j - i >1 and nums[j] == nums[j-1]:
continue
left=j+1#左指针
right=len(nums)-1#右指针
while(right>left):
temp=nums[i]+nums[j]+nums[left]+nums[right]
if temp==target:
ans.append((nums[i],nums[j],nums[left],nums[right]))
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left+=1
right-=1
if temp>target:
right-=1#太大了,右指针左移
if temp