回溯算法题目总结(c++)
1. 八皇后
class Solution {
private:
vector<vector<string>> ans;
vector<string> curr;
void recursion(int i, int n) {
// 1.终止条件
if (i >= n) {
ans.push_back(curr); //将当前解法加入结果中
}
// 2.当前处理
// 2.1 遍历所有列
for (int j=0; j<n; ++j) {
// 2.2 对于满足条件的列加入curr并且递归调用下一行,结束时回溯
if (isOk(i, j, n)) {
string temp(n, .);
temp[j] = Q;
curr.push_back(temp);
recursion(i+1, n);
curr.pop_back();
}
}
}
// 判断[i,j]放置是否和之前的放置curr冲突
bool isOk(int i, int j, int n) {
// 由下往上遍历curr
for (int k=i-1; k>=0; --k) {
// 1.不能同列
if (Q == curr[k][j]) return false;
// 2.左上对角线不能冲突,注意边界
int left_up = j - (i-k);
if (left_up >= 0 && Q == curr[k][left_up]) return false;
// 3.右上对角线不能冲突,注意边界
int right_up = j + (i-k);
if (right_up < n && Q == curr[k][right_up]) return false;
}
return true; //不冲突
}
public:
vector<vector<string>> solveNQueens(int n) {
// 1.处理
recursion(0, n);
// 2.返回结果
return ans;
}
};
空间复杂度O(n*n),时间复杂度O(n!)
2. 背包问题
leetcode相关题目:
-
416 分割等和子集(medium) 494 目标和(medium) 474 一和零(medium) 322 零钱兑换(medium) 518 零钱兑换 II(medium) 139 单词拆分(medium) 377 组合总和 Ⅳ(medium)
2.1 0-1背包
可以使用回溯,虽然不是最好的解决办法
