15.三数之和

题目来源:

        leetcode题目,网址:15. 三数之和 - 力扣(LeetCode)

解题思路:

        1.三重循环暴力遍历,超时原因,三重循环复杂度太高

        2.双重循环+哈希表,超时原因,哈希表无法判断是否重复,需要暴力遍历,从而导致超时

        3.双指针。固定第一个数的值,

解题代码:

//暴力遍历,超时
class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> res;
        sort(nums.begin(),nums.end());
        if(nums[0]>0 || nums[nums.size()-1]<0){
            return res;
        }
        for(int i=0;i0){
                    break;
                }
                for(int k=j+1;k temp={nums[i],nums[j],nums[k]};
                    if(sum3==0){
                        if(res.size()!=0 && contains(res,temp)){
                            continue;
                        }
                        res.push_back(temp);
                    }
                }
            }
        }
        return res;
    }
    bool contains(vector>& res,vector temp){
        for(int i=res.size()-1;i>=0;i--){
            if(res[i][0]!=temp[0]){
                break;
            }
            if(res[i][1]==temp[1] && res[i][2]==temp[2]){
                return true;
            } 
        }
        return false;
    }
};
//双重循环+哈希表,超时
class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> res;
        sort(nums.begin(),nums.end());
        unordered_map map;
        for(int i=0;i newMap=map;
            for(int j=nums.size()-1;j>i && nums[j]>=0;j--){
                newMap[nums[j]]--;
                if(newMap[-nums[i]-nums[j]]>0){
                    vector temp{nums[i],-nums[i]-nums[j],nums[j]};
                    if(!contains(res,temp)){
                        res.push_back(temp);
                    }
                }
            }
        }
        return res;
    }
    bool contains(vector>& res,vector temp){//res中是否包含temp
        for(int i=res.size()-1;i>=0;i--){
            if(res[i][0]==temp[0] && res[i][1]==temp[1] && res[i][2]==temp[2]){
                return true;
            } 
        }
        return false;
    }
};
//双指针
class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> res;
        sort(nums.begin(),nums.end());
        for(int i=0;i temp{nums[i],nums[left],nums[right]};
                    res.push_back(temp);
                    left++;
                    right--;
                    while(left

总结:

        没通过,看官方题解的。


你可能感兴趣的:(#,C++,LeetCode,C++)