zoukankan      html  css  js  c++  java
  • leetcode 15. 3Sum

    1,思考问题时一定要发散,基于固有的经验

    2,解题思路

      a,数据结构(容器)

      b,基本算法(搜索,匈牙利,并查集,动态规划,网络流)

      c,基本算法思想(贪心,分支)

    3,本题刚开始想的是用快排后使用map,复杂度是O(n2),超时,代码如下

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            int countIn,countOut;
            int length = nums.size() - 1;
            int temp;
            int place = 0;
            
            vector<int> resultTemp;
            vector<vector<int>> result;
            map<int,int> unMap;
            
            if(length < 2)
                return result;
            
            quickSort(nums,0,length);
            
            for(countIn =  0 ; countIn <= length ; countIn ++){
                unMap[nums[countIn]] = countIn;
                if(countIn != length)
                if(nums[countIn] < 0 &&  nums[countIn + 1] >= 0)
                    place = countIn;
                
            }
                
                
            for(countOut = 0 ; countOut <= place ; countOut ++){
                if(countOut != 0 && nums[countOut] == nums[countOut -1])
                    continue;
                
                for(countIn = length ;  countIn >= place ; countIn --){
                    temp = 0 - (nums[countOut] + nums[countIn]);
                    
                    
                    
                    if(unMap.find(temp) != unMap.end() && unMap[temp] > countOut && unMap[temp] < countIn){
                            resultTemp.push_back(nums[countOut]);
                            resultTemp.push_back(temp);
                            resultTemp.push_back(nums[countIn]);
                            
                            result.push_back({nums[countOut] , temp , nums[countIn]});
                        
                    }
                }
            }
            return result;
        };
        
        void quickSort(vector<int>& nums, int low, int high){
            int left,right;
            int where;
            int place;
            
            left = low;
            right = high;
            where = 1;
            place = nums[left];
            
            if(left >= right)
                return ;
                
            
            while(left < right){
                if(where == 1){
                    if(place > nums[right]){
                        nums[left] = nums[right];
                        left += 1;
                        where = 0;
                    }else{
                        right -= 1;
                    }
                }else{
                    if(place < nums[left]){
                        nums[right] = nums[left];
                        right -= 1;
                        where = 1;
                    }else{
                        left += 1;
                    }
                }
            }
            nums[left] = place;
            quickSort(nums, low, left-1);
            quickSort(nums, left+1, high);
        };
    };
    

     4,后来看的网上解法,左右夹逼的方法,也是O(n2

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            int countOut,left,right;
            int length = nums.size() - 1;
            int sum;
            
            vector<int> resultTemp;
            vector<vector<int>> result;
            
            if(length < 2)
                return result;
            
            quickSort(nums,0,length);
                
            for(countOut = 0 ; countOut <= length ; countOut ++){
                if(countOut != 0 && nums[countOut] == nums[countOut -1])
                    continue;
                
                left = countOut + 1;
                right = length;
                
                while(left < right){
                    sum = nums[countOut] + nums[left] + nums[right];
                    if(sum == 0){
                        result.push_back({nums[countOut] , nums[left] , nums[right]});
                        while(++left < right && nums[left] == nums[left - 1]);
                        while(--right > left && nums[right] == nums[right + 1]);
                    }else if(sum < 0){
                        left ++;
                    }else if(sum > 0){
                        right --;
                    }
                }
                
            }
            return result;
        };
        
        void quickSort(vector<int>& nums, int low, int high){
            int left,right;
            int where;
            int place;
            
            left = low;
            right = high;
            where = 1;
            place = nums[left];
            
            if(left >= right)
                return ;
                
            
            while(left < right){
                if(where == 1){
                    if(place > nums[right]){
                        nums[left] = nums[right];
                        left += 1;
                        where = 0;
                    }else{
                        right -= 1;
                    }
                }else{
                    if(place < nums[left]){
                        nums[right] = nums[left];
                        right -= 1;
                        where = 1;
                    }else{
                        left += 1;
                    }
                }
            }
            nums[left] = place;
            quickSort(nums, low, left-1);
            quickSort(nums, left+1, high);
        };
    };
    
  • 相关阅读:
    安装Flume的时候出现File Channel transaction capacity cannot be greater than the capacity of the channel capacity -解决方案 摘自网络
    在linux中配置环境变量
    CentOS中安装JAVA环境
    怎么在linux 用nginx做代理 配置.net core
    Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
    jQueryUI modal dialog does not show close button (x) JQueryUI和BootStrap混用时候,右上角关闭按钮显示不出图标的解决办法
    C#中 如何处理 JSON中的特殊字符
    php面向对象精要(3)
    php面向对象精要(2)
    php面向对象精要(1)
  • 原文地址:https://www.cnblogs.com/jackes/p/5347355.html
Copyright © 2011-2022 走看看