小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
括号生成
题目
数字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);
}
}