• 【中级算法】1.三数之和


    题目:

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
    
    注意:答案中不可以包含重复的三元组。
    
    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]

    解题思路:

    class Solution {
    public:
    /*
        vector<vector<int>> threeSum(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            vector<vector<int>> res;
            int len = nums.size();
            
            if(nums.size() < 3){
                return res;
            }
            
            for(int i = nums.size()-1;i >=2;--i){
                for(int j = i-1;j >= 1;--j){
                    for(int k = j-1;k >=0;--k){
                        if(nums[i] + nums[j] + nums[k] == 0){
                            vector<int> tmp;
                            tmp.push_back(nums[i]);
                            tmp.push_back(nums[j]);
                            tmp.push_back(nums[k]);
                            res.push_back(tmp);
                        }
                    }
                }
            }
            
            return res;
        }
    */
        int binarySearch(vector<int>& nums,int target,int start,int end){
            if(start > end){
                return -1;
            }
            
            while(start <= end){
                int mid = (start + end)/2;
                if(nums[mid] == target){
                    return mid;
                }
                if(nums[mid] > target){
                    end = mid - 1;
                }
                if(nums[mid] < target){
                    start = mid + 1;
                }
            }
            
            return -1;
        }
        
        bool findTree(vector<vector<int>> nums,int a,int b,int c){
            for(int i = 0;i < nums.size(); ++i){
                if(nums[i][0] == a &&
                   nums[i][1] == b &&
                   nums[i][2] == c){
                    return true;
                }
            }
            
            return false;
        }
        
        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> res;
            int len = nums.size();
            int target = 0;
            if(len < 3){
                return res;
            }
            
            sort(nums.begin(),nums.end());
            
            for(int i = 0;i < len-2 ; ++i){
                if(i > 0 && nums[i-1] == nums[i]){
                    continue;
                }
                for(int j = i + 1,k = len - 1 ;j < k;){
                    if(j > i + 1 && nums[j] == nums[j-1]){
                        j++;
                        continue;
                    }
                    if(k < len -1&& nums[k] == nums[k+1]){
                        k--;
                        continue;
                    }
                    int sum = nums[i] + nums[j] + nums[k];
                    if(sum > target){
                        k--;
                    }else if(sum < target){
                        j++;
                    }else{
                        vector<int> tmp;
                        tmp.push_back(nums[i]);
                        tmp.push_back(nums[j]);
                        tmp.push_back(nums[k]);
                        res.push_back(tmp);
                        j++;
                        k--;    
                    }
                }
            }
            
            return res;
        }
    
    };
  • 相关阅读:
    黄聪:dreamweaver jquery代码提示安装,DW JQ代码智能提示
    明明白白AOP(你没有理由不心领神会!)
    myeclipse安装svn插件的多种方式
    spring注解
    freemarker入门例子
    MyEclipse10 中的两种FreeMarker插件的安装与配置
    优秀程序员必备的10个技能
    p2psearcher无法连接到KAD网络或ed2k服务器的解决办法
    MyEclipse 8.6.1下载|MyEclipse 8下载|MyEclipse 8.6.1官网下载
    网络技术网站
  • 原文地址:https://www.cnblogs.com/mikemeng/p/9011634.html
Copyright © 2020-2023  润新知