zoukankan      html  css  js  c++  java
  • 双指针---最接近的三数之和

    题目描述:

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

    示例:

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

    提示:

    3 <= nums.length <= 10^3 -10^3 <= nums[i] <= 10^3 -10^4 <= target <= 10^4

    解题思路:

    了解昨天三数之和的话,这道题应该也会有思路,同样适用双指针解法。

    此题的算法思路如下:

    1. 对数组进行排序(排序是必须的,否则无法判断及指针移动)。
    2. 初始化返回结果 ans 为 nums[0] + nums[1] + nums[2](初始化为Int的最大值也行,反正都是用于判断跟新)
    3. 遍历排序后数组,并计算当前指向三数的 sum = nums[i] + nums[l] + nums[r] :
      • 若 abs(target-sum) <  abs(target-ans) (abs 是求绝对值),表示当前 sum 距离更近,则更新结果 ans = sum
      • 若 sum < target ,左指针 L 右移
      • 若 sum > target,右指针 R 左移

    代码实现

    //go
    func threeSumClosest(nums []int, target int) int {
     sort.Ints(nums) // 排序
     length := len(nums)
     ans := nums[0] + nums[1] + nums[2]
     for i := 0; i < length; i++ {
      l, r := i+1, length-1
      for l < r {
       sum := nums[i] + nums[l] + nums[r]
       if AbsInt(target-sum) < AbsInt(target-ans) {
        ans = sum
       }
       if sum < target {
        l++
       } else if sum > target {
        r--
       } else {
        return ans
       }
      }
     }
     return ans
    }
    
    func AbsInt(x int) int {
     if x < 0 {
      return -x
     }
     return x
    }
    

      地址:https://mp.weixin.qq.com/s/vg7Va9D0U-Op44x4teMm9w

  • 相关阅读:
    简爱 灵魂所在
    charles抓取http/https
    Class.forName()用法
    ArrayList源码剖析
    java中的多线程
    分布式负载均衡缓冲系统,如何快速定位到是那个服务器
    maven依赖jar包时版本冲突的解决
    简单工厂模式设计(java反射机制改进)
    Fiddler 抓包工具使用详解
    Fiddler 使用
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13395214.html
Copyright © 2011-2022 走看看