zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    Windows Server 2008 R2 免费使用 7200天 激活
    ceph部署步骤
    for循环间隔修改(解决把以空格隔开需要把一整行作为整体)
    my_learn
    fiddler-抓包
    基础软件搭建
    【原创】一层Nginx反向代理K8S化部署实践
    【原创】K8S使用ceph-csi持久化存储之CephFS
    【原创】K8S使用ceph-csi持久化存储之RBD
    [原创]自动化部署K8S(v1.10.11)集群
  • 原文地址:https://www.cnblogs.com/joelwang/p/12038642.html
Copyright © 2011-2022 走看看