【Leetcode】排序+双指针-16

112 阅读1分钟

>0️⃣python数据结构与算法学习路线
>学习内容:
>- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等...
>- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等...

题目:

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

输入输出:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

解题思路:

和15题类似

算法实现: 

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        l = len(nums)
        nums.sort()
        m = nums[0]+ nums[1]+nums[2]
        for i1 in range(l):
            # 不进行重复的无意义循环
            if i1 > 0 and nums[i1] == nums[i1-1]:
                continue
            i2 = i1 + 1
            i3 = l - 1
            while i2 < i3:
                ans = nums[i1] + nums[i2] + nums[i3]
                if ans == target:
                    return ans
                if abs(ans - target) < abs(m - target):
                    m = ans
                if ans < target:
                    while i2 < i3 and nums[i2] == nums[i2+1]:
                        i2 += 1
                    i2+=1
                elif ans > target:
                    while i2 < i3 and nums[i3] == nums[i3-1]:
                        i3 -= 1
                    i3 -=1
        return m

出现问题:

1. 绝对值abs()

2. m可以设置为一个极大值,正负无穷大为float("inf"), float("-inf")