[Leetcode] 16. 3Sum Closet 双指针

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
            

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值