三数之和

别说谁变了你拦得住时间么 提交于 2020-03-07 12:07:25

Q1:给定一个包含 n 个整数的数组 nums和目标数target,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = target ?

请你找出所有满足条件且不重复的三元组。

分析:将三数问题转化为两数问题,使用双指针left,right定位,从第一个位置i开始遍历,寻找i之后的满足的nums[l]+nums[r]+nums[i] == target的数

class Solution:
    def threeSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        res= []
        for i in range(len(nums)):
            # 如果排序后第一个数大于target,则跳出循环,不可能有为target的三数之和
            if nums[i] > target:
                break
            if i>0 and nums[i]==nums[i-1]:
                continue
            l,r = i+1,len(nums)-1
            while l<r:
                sum = nums[l]+nums[r]+nums[i]
                if sum == target:
                    res.append([nums[i],nums[l],nums[r]])
                    while l<r and nums[l]==nums[l+1]:
                        l += 1
                    while l<r and nums[r]==nums[r-1]:
                        r -= 1
                    l += 1
                    r -= 1
                elif sum < target:
                    l += 1
                else:
                    r -= 1
        return res

Q2:

定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        res = 0
        nums.sort()
        for i in range(len(nums)):
            l,r=i+1,len(nums)-1
            while l<r:
                temp = nums[l]+nums[r]+nums[i]
                if res == 0 or res>abs(target-temp):
                    res = abs(target-temp)
                    ans = temp
                if temp == target:
                    return target
                elif temp<target:
                    l += 1
                else:
                    r -= 1
        return ans

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!