码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 15. 3Sum

时间:2016-04-02 13:33:37      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

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);
    };
};

 

leetcode 15. 3Sum

标签:

原文地址:http://www.cnblogs.com/jackes/p/5347355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!