leetcode16 最接近的三数之和

做了几周的hard之后,这道题居然轻易就解出来了,稍微debug了一下就ac了,算是有了一丢丢提高把;

思路

这道题因为和三数之和很像,所以充分利用双指针的思想;先排序,然后再固定一个数i,i取值从【0,n-i】,
然后对r=i+1,l=n-1利用双指针来找最近的数

下面是直接应用abs 和sort库函数的代码,头文件 < algorithm > or <bits/stdc++.h>

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        //time O(n^2), space O(1);
        int n=nums.size();
        if(n<3) return -1;
        int res=nums[0]+nums[1]+nums[2];
        sort(nums.begin(),nums.end());

        for(int i=0;i<=n-3;i++){
            int l=i+1,r=n-1;

            while(l<r){
                int tmp_sum=nums[i]+nums[l]+nums[r];
                if(tmp_sum>target) r--;
                else l++;
                if(abs(tmp_sum-target)<abs(res-target)) res=tmp_sum;
            }
        }
        return res;
    }
};

自己写快速排序qsort 和lambda表达式(在此类似于内联函数) f_abs的代码:

class Solution {
public:

    void qsort(vector<int>&nums, int start, int end){
        if(start>=end) return;
        
        //partition block;
        int pivot=nums[start];
        int l=start,r=end;
        while(l<r){
            while(l<r && nums[r]>=pivot)
                r--;
            nums[l]=nums[r];
            while(l<r && nums[l]<=pivot)
                l++;
            nums[r]=nums[l];
        }
        nums[l]=pivot;
        pivot=l;

        //recursion block;
        qsort(nums,start,pivot-1);
        qsort(nums,pivot+1,end);
    }
    int threeSumClosest(vector<int>& nums, int target) {
        //time O(n^2), space O(1);
        int n=nums.size();
        if(n<3) return -1;
        int res=nums[0]+nums[1]+nums[2];
        qsort(nums,0,n-1);

        auto f_abs = [&](int num){return num>0?num:(-num);};
        for(int i=0;i<=n-3;i++){
            int l=i+1,r=n-1;

            while(l<r){
                int tmp_sum=nums[i]+nums[l]+nums[r];
                if(tmp_sum>target) r--;
                else l++;
                if(f_abs(tmp_sum-target)<f_abs(res-target)) res=tmp_sum;
            }
        }
        return res;
    }
};
posted @ 2019-12-14 12:02  Joel_Wang  阅读(120)  评论(0编辑  收藏  举报