22. 括號生成
題目:數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。
示例:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
--------------------------------------------------------------------------------------------------
思路:定義一個記錄當前左括號數量leftCnt和當前右括號數量rightCnt。想象成一個二叉樹,向左嘗試即爲加上'('的字符串,右向右嘗試即爲加上')'的字符串。不斷向左和向右試探,如果右括號數量大於左括號數量 或者 左右括號數量有一個超過n值,則返回。
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
dfs(res, "", 0, 0, n);
return res;
}
void dfs(List<String> res, String path, int leftCnt, int rightCnt, int n) {
if(leftCnt == rightCnt && leftCnt == n) {
res.add(path);
return;
}
if(leftCnt < n)
dfs(res, path + '(', leftCnt + 1, rightCnt, n);
if(rightCnt < leftCnt)
dfs(res, path + ')', leftCnt, rightCnt + 1, n);
}
46. 全排列
題目:給定一個 沒有重複 數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
--------------------------------------------------------------------------------------------------
思路:對於數1,它有2,3兩個數字可選:對於(12)則只有選擇3;對於(13)則只有選擇2。其他兩個數也是類似的道理。
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
createTree(nums, new LinkedList<Integer>());
return res;
}
void createTree(int[] nums, LinkedList<Integer> path) {
if(path.size() == nums.length) {
res.add(new LinkedList(path));
return;
}
for(int i = 0; i < nums.length; i++) {
if(path.contains(nums[i]) != true) {
path.add(nums[i]);
createTree(nums, path);
path.removeLast();
}
}
}