括号生成&子集

146 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

括号生成

题目

数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。

有效括号组合需满足:左括号必须以正确的顺序闭合。

思路

1.使用n个"("和n个")",在任意时刻字符串中左括号的数量要>=右括号的数量(如果右括号数量多肯定无效)

2.left表示剩余可以使用的左括号的数量,right表示剩余可以使用的右括号的数量,当两个括号都使用完添加拼接的字符串

3.当left==right的时候只能添加左括号,而当left<right的时候既能添加左括号又能添加右括号

注意:代码中的left和right表示的是剩余可以使用括号的数量

代码

class Solution {
    List<String> res = new ArrayList<>();

    public List<String> generateParenthesis(int n) {
        process(n, n, "");
        return res;
    }

    public void process(int left, int right, String str) {
        if (left == 0 && right == 0) {
            res.add(str);
            return;
        }
        if (left == right) { //只能添加左括号
            process(left - 1, right, str + "(");
        } else {
            if (left > 0) { //既可以添加左括号也可以添加右括号
                process(left - 1, right, str + "(");
            }
            process(left, right - 1, str + ")");
        }


    }

}

子集

题目

给你一个整数数组 nums,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能包含重复的子集。你可以按任意顺序返回解集。

思路

1.回溯,每次跑完一种情况后remove移除,为了不干扰其他的情况

代码


class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> list = new ArrayList<>();

    public List<List<Integer>> subsets(int[] nums) {
        dfs(0, nums);
        return res;
    }

    public void dfs(int cur, int[] nums) {
        if (cur == nums.length) {
            res.add(new ArrayList<>(list));
            return;
        }
        list.add(nums[cur]);
        dfs(cur + 1, nums);
        list.remove(list.size() - 1);
        dfs(cur + 1, nums);
    }
}