学习前言
太累了太累了!
题目
1、括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
2、全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解法
1、括号生成
class Solution {
public:
void backtrace(int left, int right, int n, string& s, vector<string>& res) {
if (left == n && right == n) {
res.push_back(s);
return;
}
if (left < n) {
s += "(";
backtrace(left + 1, right, n, s, res);
s.pop_back();
}
if (right < left) {
s += ")";
backtrace(left, right + 1, n, s, res);
s.pop_back();
}
}
vector<string> generateParenthesis(int n) {
vector<string> vec;
string s="";
backtrace(0,0,n,s,vec);
return vec;
}
};
思路:
利用回溯法,利用left,right分别记录已经添加的左右括号的数目。
2、全排列
class Solution {
public:
void backtrace(int index,vector<int>& nums, vector<vector<int>>& sorted){
if(index == nums.size()){
sorted.push_back(nums);
return;
}
for(int j = index; j<nums.size(); j++){
if(index!=j) swap(nums[index],nums[j]);
backtrace(index+1,nums,sorted);
if(index!=j) swap(nums[index],nums[j]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> out;
backtrace(0,nums,out);
return out;
}
};
思路:
利用回溯法,每次固定一个位置,对后面的位置利用回溯法打乱。