《双指针》16. 最接近的三数之和《leetcode》

本文介绍了一种使用双指针法解决三数之和问题的方法,该方法能够在O(n^2)的时间复杂度内找到与目标值最接近的三个数的和。

16. 最接近的三数之和

难度中等627

给定一个包括 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

通过次数166,068提交次数362,387

思路解析:

双指针:sum=nums[i]+nums[start]+nums[end];

start=i+1, end=nums.size()-1;

从0到i-2进行遍历,(想一想为什么是i-2)

对于每个i ,对start和end进行加减变换,(之前要对vector进行排序)

当sum>target时 end--;

当sum==target时 return target

当sum<target时, start++;

同时更新sum 更新ans:

直到start=end  

继续遍历下一个i。

AC代码展示:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int ans=nums[0]+nums[1]+nums[2];
        for(int i=0;i<nums.size()-2;i++)
        {
            int start=i+1;
            int end=nums.size()-1;
            int sum;
            while(start!=end)
            {
                sum=nums[i]+nums[start]+nums[end];
                if(abs(target-sum)<abs(target-ans))//更新答案
                    ans=sum;
                if (sum>target)//优化
                    end--;
                else if(sum==target)
                    return 0;
                else
                    start++;
            }
        }
        return ans;
    }
};

 再提一点:

  首先:暴力搜索的话 时间复杂度O(n^3),双指针的话 i遍历O(n) start,end的话O(n) 总体O(n^2)  加上排序O(nlogn),总体复杂度O(n^2);

  其次:学习双指针这种思想吧。

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值