最接近的三数之和(双指针法)

题目:

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

题解:

首先,暴力法O(N^3),对于无序数组采取暴力法,我们对该解法进行优化,首先,有序的数组更加方便我们进行查找等操作,所以先对数组快速排序O(N*logN),接下来有两条路可选。
方法一: O(N^2)进行两重循环,将所有两个数的组合按序存储下来,然后对原来数组中的每一个元素进行二分查询O(NlogN *N),总时间复杂度O(N * N)。
方法二: 先固定一个数,题目转化为找到2个数的和到target-nums[i]最近,双指针法O(N)即可找到,总复杂度O(N *N),空间复杂度较第一种更好。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int ans;
        int n=nums.size();
        int mmin=INT_MAX;
        for(int i=0;i<n;i++)
        {
            int pb=i+1,pc=n-1;
            while(pb<pc)
            {
                int sum=nums[pb]+nums[pc]+nums[i];
                if(sum==target) return target;
                else if(sum>target)
                {
                    if(abs(sum-target)<mmin)
                    {
                        ans=sum;
                        mmin=abs(sum-target);
                    }
                    pc--;
                }else
                {
                    if(abs(sum-target)<mmin)
                    {
                        ans=sum;
                        mmin=abs(sum-target);
                    }
                    pb++;
                }
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值