leetcode -- 三数之和,四数之和等类似
问题描述:
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
1 class Solution(object): 2 def threeSum(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: List[List[int]] 6 """ 7 nums.sort()#先给列表内的数排序 8 N, result = len(nums), [] 9 for i in range(N): 10 if i>0 and nums[i] == nums[i-1]:#排除重复的组合 11 continue 12 target = -nums[i]#把求三数之和变为求两数之和 13 l, r = i+1, N-1 #从两边往中间挤,找合适的组合 14 while l < r: 15 if nums[l]+nums[r] == target: 16 result.append([nums[i], nums[l], nums[r]]) 17 l += 1 18 while l < r and nums[l] ==nums[l-1]:#继续排除重复的组合 19 l += 1 20 elif nums[l] + nums[r] < target:#小于目标值的时候,右移 21 l += 1 22 else: 23 r -= 1 24 return result
18.四数之和
给定一个包含 n 个整数的数组 nums
和一个目标值 target
,判断 nums
中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target
相等?找出所有满足条件且不重复的四元组。
1 class Solution(object): 2 def fourSum(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: List[List[int]] 7 """ 8 nums.sort() 9 N = len(nums) 10 result = [] 11 for i in range(N): 12 for j in range(i+1, N): 13 l, r = j+1, N-1 14 while l < r: 15 sums = nums[i]+nums[j]+nums[l]+nums[r] 16 if sums < target: 17 l += 1 18 elif sums > target: 19 r -= 1 20 else: 21 if [nums[i], nums[j], nums[l], nums[r]] not in result: 22 result.append([nums[i], nums[j], nums[l], nums[r]]) 23 l += 1 24 r -= 1 25 return result
16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
1 class Solution(object): 2 def threeSumClosest(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: int 7 """ 8 nums.sort()#排序 9 result = nums[1]+nums[2]+nums[3]#先给定一个比较的标准 10 for i in range(len(nums)-2): 11 l, r = i+1, len(nums)-1 12 while l < r: 13 sums = nums[i]+nums[l]+nums[r]#从两边向中间挤 14 if sums == target: 15 return sums 16 if abs(sums-target) < abs(result-target):#和目标值的差的绝对值小的放入到结果 17 result = sums 18 if sums < target:#三数之和小于目标值,l右移 19 l += 1 20 elif sums > target:#大于的话就r左移 21 r -= 1 22 return result