• 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 };
  • 相关阅读:
    明星球队的傲慢
    VS2010测试方面的文章重点
    项目管理有感
    团队从小到大,再到体验团队
    css实现文字渐变
    echarts坐标轴文字过长省略
    mustache+mock
    你有选择的权利
    呵呵,初学者小编
    Centos7升级到OpenSSH_8.8p1、OpenSSL 1.1.1l版本
  • 原文地址:https://www.cnblogs.com/wmx24/p/9074151.html
Copyright © 2020-2023  润新知