zoukankan      html  css  js  c++  java
  • LeetCode 16. 最接近的三数之和(3Sum Closest)

    题目描述

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

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

    解题思路

    考虑用双指针法解题。首先将数组从小到大排序,并令最接近的数closest初始化为前三个数的和。每遍历到一个数,计算后面两个数之和比较的目标tar=target-nums[i],然后令左指针left指向其后第一个数,右指针right指向最后一个数,然后计算左右指针指向数字之和与tar的差sum。

    • 若sum为0,则说明此时三个数的和正好为target,所以直接返回target
    • 若sum的绝对值小于closest-target的绝对值,说明此时三个数的和为最接近target的数,所以更新closest
    • 若左右指针指向的数字之和小于tar,此时令左指针向右移动一位有可能让和更接近tar;否则让右指针左移一位。这样移动直到左右指针重合

    代码

     1 class Solution {
     2 public:
     3     int threeSumClosest(vector<int>& nums, int target) {
     4         sort(nums.begin(),nums.end());
     5         int closest=nums[0]+nums[1]+nums[2],l=nums.size();
     6         for(int i=0;i<l-2;i++){
     7             int left=i+1,right=l-1;
     8             int tar=target-nums[i];
     9             int sum;
    10             while(left<right){
    11                 sum=nums[left]+nums[right]-tar;
    12                 if(sum==0)
    13                     return target;
    14                 if(abs(sum)<abs(closest-target))
    15                     closest=target+sum;
    16                 if(nums[left]+nums[right]<tar)
    17                     left++;
    18                 else
    19                     right--;
    20             }
    21         }
    22         return closest;
    23     }
    24 };
  • 相关阅读:
    linux centos 7.5 开启 postgresql 远程访问
    linux centos 7 开启 ftp
    CentOS 7.5 改IP后不生效无法上网解决办法
    Windows Server 2008R2 及上系统安装 Windows 可选功能
    C#只允许运行一个实例
    C# 命令行参数分割
    C# 获取所有已登录系统的用户名
    C#获取进程用户名
    psexec 用法
    检测 Visual C++ Redistributable Package 相应版本是否已安装
  • 原文地址:https://www.cnblogs.com/wmx24/p/9074151.html
Copyright © 2011-2022 走看看