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
posted @ 2019-02-24 21:41  夜雨声入眠  阅读(159)  评论(0编辑  收藏  举报