【递归】 LEETCODE22 生成合法的n个括号串

// left是当前可用的左括号数,right是当前可用的右括号数,思路就是从左到右地找每一种可能。
// 当前,如果left==right的话,下一个字符一定只能是“(”
//如果left<right并且都大于0,下一个字符有两种可能
//如果left=0而right还有,下一个字符只能是“)”
//当left==right==0时,递归终点,完成了一个串的构造,把它放入result中。
//beats 100%,0.00ms。
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> result;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>0) break;
            if(i>0 && nums[i]==nums[i-1]) continue;
            int left=i+1,right=nums.size()-1;
            while(left<right){
                int sum=nums[left]+nums[right]+nums[i];
                if(sum>0){
                    right--;
                }
                else if(sum<0){
                    left++;
                }
                else{
                    result.push_back({nums[i],nums[left],nums[right]});
                    int l=nums[left];
                    int r=nums[right];
                    while(left<right&&nums[left]==l) left++;
                    while(right>left&&nums[right]==r) right--;
                }
            }
        }
        return result;
    }
};

猜你喜欢

转载自www.cnblogs.com/rarecu/p/11520938.html