[Leetcode] 16. 3Sum Closet 双指针

3SumClosest算法解析
本文深入解析3SumClosest算法,旨在寻找数组中三个数的组合,使其和最接近给定目标值。通过双指针技巧,文章详细阐述如何高效地遍历所有可能的组合,同时避免不必要的比较,实现快速求解。

16. 3Sum Closest(题目链接

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

核心思想:two pointer   过滤掉一些没有必要比较的点

本质上是枚举所有可能的情况,同时去掉一些没有必要比较的点。

两个指针从两边向中间聚,可以找出小范围内(这个小范围是第一个数确定以后,所有可能的范围)的最大值或者最小值。为什么会快?删除掉了一些没必要比较的点,比如target=10,我们计算出当前的三个数的和是11,那么和比11大的三个数就没有必要枚举了。

c++:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int closeSum=nums[0]+nums[1]+nums[2];
        int AbsDifference=abs(closeSum-target);
        sort(nums.begin(), nums.end());
        for(int i=0; i<=nums.size()-3; i++) {
            int secondNum = i+1;
            int thirdNum = nums.size()-1;
            int tempSum;
            while(secondNum<thirdNum) {
                tempSum = nums[i]+nums[secondNum]+nums[thirdNum];
                if(abs(tempSum-target)<AbsDifference) {
                    AbsDifference = abs(tempSum - target);
                    closeSum = tempSum;
                }
                if(tempSum<target) {
                    secondNum++;
                }
                else if(tempSum>target) {
                    thirdNum--;
                }
                else {
                    return target;
                }
            }
        }
        return closeSum;
    }
};

python

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        rlt = nums[0] + nums[1] +nums[2]
        for i in range(len(nums) - 2):
            first, second, third = i, i + 1, len(nums) - 1
            while second < third:
                temp = nums[first] + nums[second] + nums[third]
                if abs(temp - target) < abs(rlt - target):
                    rlt = temp
                if temp < target:
                    second += 1
                elif temp > target:
                    third -= 1
                else:
                    return target
        return rlt
            

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值