Leetcode-回溯算法
Leetcode-回溯算法
回溯
22. 括号生成
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的括号组合。
class Solution {
public:
vector<string> result;
void backtracking(vector<string> temp, int n, int nowleft, int nowright){
if(temp.size() == n * 2){
string res = "";
for(int i=0;i<temp.size();i++){
res += temp[i];
}
result.push_back(res);
return;
}
if (nowleft < n){
temp.push_back("(");
backtracking(temp,n,nowleft+1,nowright);
temp.pop_back();
}
if(nowright < n && nowright < nowleft){
temp.push_back(")");
backtracking(temp,n,nowleft,nowright+1);
temp.pop_back();
}
}
vector<string> generateParenthesis(int n) {
vector<string> temp;
backtracking(temp,n,0,0);
return result;
}
};
31. 下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
- 例如,
arr = [1,2,3]
,以下这些都可以视作arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如,
arr = [1,2,3]
的下一个排列是[1,3,2]
。 - 类似地,
arr = [2,3,1]
的下一个排列是[3,1,2]
。 - 而
arr = [3,2,1]
的下一个排列是[1,2,3]
,因为[3,2,1]
不存在一个字典序更大的排列。
给你一个整数数组 nums
,找出 nums
的下一个排列。
必须原地修改,只允许使用额外常数空间。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
int index = n-1;
for(;index>=1;index--){
if(nums[index] > nums[index-1]){
break;
}
}
if(index != 0){
index -= 1;
for(int i=n-1;i>=0;i--){
if(nums[i] > nums[index]){
swap(nums[index], nums[i]);
reverse(nums.begin()+index+1,nums.end());
return;
}
}
}
else{
reverse(nums.begin(), nums.end());
}
}
};
79. 单词搜索
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
class Solution {
public:
bool result = false;
void DFS(int i, int j, int m, int n,int now, vector<vector<char>>& board,vector<vector<bool> > &visited, string word){
if(i < 0 || j < 0 || i >= m || j >= n || visited[i][j] == true || board[i][j] != word[now]){
return;
}
if(now == word.size() - 1){
result = true;
return;
}
visited[i][j] = true;
DFS(i+1,j,m,n,now+1,board,visited, word);
DFS(i-1,j,m,n,now+1,board,visited, word);
DFS(i,j+1,m,n,now+1,board,visited, word);
DFS(i,j-1,m,n,now+1,board,visited, word);
visited[i][j] = false;
}
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
vector<vector<bool> > visited(m, vector<bool>(n, false));
DFS(i,j,m,n,0,board,visited, word);
if(result){
return result;
}
}
}
return result;
}
};
Leetcode-回溯算法
https://zhangzhao219.github.io/2024/04/14/Leetcode/Leetcode-bkt/