算法学习打卡计划

leetcode第十六题 —— 最接近的三数之和

2019-11-18  本文已影响0人  不分享的知识毫无意义

1.题目

原题

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

例子

输入:  nums = [-1,2,1,-4], target = 1。
输出: 2。
解释:-1+1+2 = 2与给定的目标1最为接近。

2.解析

这道题最简单的解法就是暴力求解法,即用一个三层循环就可以完成任务,但是这其中会有重复计算,时间复杂度也很高,为o(n^3)。
肯定有简化的办法:
1)对输入数组进行排序
2)设置数组初始位置变量i和终止位置变量k
3)计算三数和与target想比是大还是小,因为是排序数组,如果大于target就减少k的值,如果小于target就增加i的值。
4)将当前值与最小的和与target差值比较,小就更新。
此题的关键在于遍历下标的设置。

3.python代码

class Solution:
    def threeSumClosest(self, nums, target):
        nums.sort()
        nearst_sum = nums[0] + nums[1] + nums[2]
        for i in range(len(nums)):
            j = i + 1
            k = len(nums) - 1
            while j < k:
                tmp = nums[i] + nums[j] + nums[k] - target
                if tmp == 0:
                    return target
                elif tmp < 0:
                    if abs(tmp) < abs(nearst_sum - target):
                        nearst_sum = tmp + target
                    j += 1
                elif tmp > 0:
                    if abs(tmp) < abs(nearst_sum - target):
                        nearst_sum = tmp + target
                    k -= 1
        return nearst_sum
上一篇下一篇

猜你喜欢

热点阅读