• two sum


    //method 1: quick sort + Loop
    
    //beat 89%
    
    void quickSort(vector<int> &nums,int iLeft,int iRight,int *arrIndex){
    
        if(iLeft>=iRight)
    
            return;
    
        int idxRand = rand()%(iRight-iLeft+1) + iLeft;
    
        int idxRand_Index = arrIndex[idxRand];
    
        int iPivot = nums[idxRand];
    
        
    
        nums[idxRand] = nums[iLeft];
    
        arrIndex[idxRand] = arrIndex[iLeft];
    
        
    
        int iBegin = iLeft;
    
        int iEnd = iRight;
    
        while(iBegin<iEnd){
    
            while(iBegin<iEnd && nums[iEnd]>=iPivot)
    
                iEnd--;
    
            nums[iBegin] = nums[iEnd];
    
            arrIndex[iBegin] = arrIndex[iEnd];
    
            
    
            while(iBegin<iEnd && nums[iBegin]<=iPivot)
    
                iBegin++;
    
            nums[iEnd] = nums[iBegin];
    
            arrIndex[iEnd] = arrIndex[iBegin];
    
        }
    
        nums[iBegin] = iPivot;
    
        arrIndex[iBegin] = idxRand_Index;
    
        
    
        quickSort(nums,iLeft,iBegin-1,arrIndex);
    
        quickSort(nums,iBegin+1,iRight,arrIndex);
    
    }
    
    
    
    vector<int> twoSum(vector<int>& nums, int target) {
    
        vector<int> retArr;
    
        
    
        //sort
    
        int *arrIndex = (int *)malloc(sizeof(int)*nums.size());
    
        for(int iLoop=0;iLoop<nums.size();iLoop++){
    
            arrIndex[iLoop]=iLoop;
    
        }
    
        quickSort(nums,0,nums.size()-1,arrIndex);
    
        
    
        //search
    
        int iLeft = 0;
    
        int iRight = nums.size()-1;
    
        while(iLeft<iRight){
    
            int sum = nums[iLeft]+nums[iRight];
    
            if(sum==target)
    
            {
    
                retArr.push_back(arrIndex[iLeft]+1);
    
                retArr.push_back(arrIndex[iRight]+1);
    
                break;
    
            }
    
            else if(sum<target)
    
                iLeft++;
    
            else //sum>target
    
                iRight--;
    
        }
    
        
    
        
    
        free(arrIndex);
    
        sort(retArr.begin(),retArr.end());
    
        return retArr;
    
    }
    
    
    
    //method 2: use std::map<int,int>
    
    //beat 25%
    
    vector<int> twoSum1(vector<int>& nums, int target) {
    
        map<int,int> m;
    
        vector<int> retVec;
    
        for(int iLoop = 0;iLoop < nums.size();iLoop++){
    
            auto itr= m.find(target-nums[iLoop]);
    
            if(itr==m.end()){
    
                m[nums[iLoop]] = iLoop;
    
            }
    
            else
    
            {
    
                retVec.push_back(itr->second+1);
    
                retVec.push_back(iLoop+1);
    
                break;
    
            }
    
        }
    
        return retVec;
    
    }
    

      

  • 相关阅读:
    c#缓存技术(Dictionary)
    反射Reflection创建
    SQL Server手注之延时型盲注
    MySQL——事务
    MySQL——NULL值处理
    MySQL——连接的使用
    SQL server手注之报错注入
    SQL Serves手注之联合查询注入
    MySQL手注之ROOT权限处理
    MySQL——正则表达式
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/7200654.html
Copyright © 2020-2023  润新知