zoukankan      html  css  js  c++  java
  • LeetCode-3 Sum

    3SumJan 18 '12    6170 / 23359

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    Note:

    • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ? b ? c)
    • The solution set must not contain duplicate triplets.
        For example, given array S = {-1 0 1 2 -1 -4},
    
        A solution set is:
        (-1, 0, 1)
        (-1, -1, 2)
    

    沿用了3 Sum closest的代码

    class Solution {
    public:
         void swap(vector<int> &num,int i,int j){
            int temp=num[i];
            num[i]=num[j];
            num[j]=temp;
        }
        void bottomUp(vector<int> &num,int end){
            while(end>0)
            {
            if(num[end]>num[end/2]){
            swap(num,end,end/2);
            end/=2;
            }
            else break;
            }
        }
        void topDown(vector<int>&num,int end){
            int index=0;
            while(true){
            if(index*2>end){
                break;
            }
            else if(index*2==end){
                if(num[index]<num[index*2]){
                    swap(num,index,index*2);
                    index*=2;
                }
                else break;
            }
            else{
                int big=num[index];
                int bigindex=index;
                if(num[index*2]>big){
                    big=num[index*2];
                    bigindex=index*2;
                }
                if(num[index*2+1]>big){
                    bigindex=index*2+1;
                }
                if(bigindex==index)break;
                else{
                swap(num,index,bigindex);
                index=bigindex;
                }
            }
            }
        }
        void sort(vector<int>&num){
            for(int i=0;i<num.size();i++){
                bottomUp(num,i);
            }
            for(int i=num.size()-1;i>0;i--){
                swap(num,0,i);
                topDown(num,i-1);
            }
        }
        int getIndexNearestSmall(vector<int>&num,int start,int end,int target){
            if(start==end)return start;
            int mid=(start+end)/2;
            if(num[mid]>target) return getIndexNearestSmall(num,start,mid,target);
            else if(num[mid]==target) return mid;
            else return getIndexNearestSmall(num,mid+1,end,target);
        }
        int getIndexNearestSmall(vector<int>&num,int start,int target){
            if(num[start]>target)return start;
            if(num[num.size()-1]<target)return num.size()-1;
            else return getIndexNearestSmall(num,start,num.size()-1,target);
        }
    
        vector<vector<int> > threeSum(vector<int> &num) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            vector<vector<int>> result;
            if(num.size()<3)return result;
            int target=0;
            sort(num);
            int sum=0;
            int best=0;
            for(int i=0;i<num.size()-2;i++){
                for(int j=i+1;j<num.size()-1;j++){
                    //cout<<i<<" "<<j<<endl;
                    int k=getIndexNearestSmall(num,j+1,target-num[i]-num[j]);
                    sum=num[i]+num[j]+num[k];
                    
                    if(sum==target){
                        vector<int> ret;
                        ret.push_back(num[i]);
                        ret.push_back(num[j]);
                        ret.push_back(num[k]);
    
                        bool flag=true;
                        for(int ii=0;ii<result.size();ii++){
                            if(result[ii][0]==ret[0]&&result[ii][1]==ret[1]&&result[ii][2]==ret[2])
                            {flag=false;break;}
                        }
                        if(flag)
                        result.push_back(ret);
                   }             
                }
            }
            return result;
        }
    };
    
  • 相关阅读:
    【python学习笔记】字符串格式化
    React-Props 一/列表渲染/条件渲染
    搜索电影小demo-react版(10.5-10.6)
    todolist-react版(9.20-9.21)
    el-form、form 等表单校验哪些事
    iframe 详解-在vue中使用iframe/iframe在vue中使用
    jmeter-beanshell 前置处理器 传参
    jmeter-beanshell-Typed variable declaration
    java 获取当前时间的年份、月份、周数
    jmeter-java.net.URISyntaxException: Illegal character in query at index 76
  • 原文地址:https://www.cnblogs.com/superzrx/p/3182889.html
Copyright © 2011-2022 走看看