zoukankan      html  css  js  c++  java
  • LeetCode 16. 最接近的三数之和

    题目:


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

    例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
    
    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
    
    

    思路:

    Target 固定,三个数的组合的和最接近target即返回,答案唯一。

    所以,首先思路是排序,然后找三个数相加的减去target 取绝对值比较,最小的那组返回value即可。

    方法一:

    这和上一题思路很像,先来一个笨方法,去找每一个三数相加组合去比较,很显然超时....

    class Solution(object):
        def threeSumClosest(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: int
            """
            nums.sort() 
            length = len(nums)
            res = {}
            for i in xrange(length):
                j = i+1
                while j<=length-2 :
                    k = j
                    while k <= length-2:
                        k +=1
                        res[abs(nums[i]+nums[j]+nums[k]-target)] = nums[i]+nums[j]+nums[k]
                    j +=1   
            return res[min(list(res.keys()))] 
    

    方法二:

    如何减少循环次数呢,两个while的地方肯定有一部分是可以舍去的,因为有做排列动作。结合上题三数之和方法二的思路,采用双指针去做,这样就不用2个while 去遍历了,一个while即可,处理思想和方法一一样,取差值绝对值返回最小值value,但是时间省了不少。

    class Solution(object):
        def threeSumClosest(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: int
            """
            nums.sort() 
            length = len(nums)
            res = nums[0] + nums[1] + nums[2]
            for i in xrange(length):
                left, right = i + 1 , length - 1
                while left < right:
                    res_sum = nums[i] + nums[left] + nums[right]
                    if abs(res_sum-target) < abs(res - target):
                        res = res_sum
                    if res_sum > target:
                        right -=1
                    elif res_sum < target:
                        left +=1
                    else:
                        return res_sum
            return res
    
    

    执行用时 :68 ms, 在所有 Python 提交中击败了72.01%的用户

    内存消耗 :12.6 MB, 在所有 Python 提交中击败了12.50%的用户

  • 相关阅读:
    线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
    C#打印图片
    javascript 地址栏写法
    SQLServer获取Excel中所有Sheet
    C#多页打印实现
    clear在CSS中的妙用
    mitmproxy使用总结
    本地回路抓包问题
    博客园界面优化
    CentOS基于MySQL提供的Yum repository安装MySQL5.6
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/13072633.html
Copyright © 2011-2022 走看看