1 前言
今天睡了太久中午起来打算刷LeetCode每日一题,结果做了半天没做出来,看了题解头都大了,然后接着就是头昏脑胀,晚上才开始刷题。我吐槽一下,LeetCode你想干嘛呢,才刷了几天题推那么难(2338)。
2 水水水水
刷题坚持下去了但写博客太耗时间了,实在不想写了,以后也不会在写题解了,最多记录一下。
今天刷了三道题,分别是二叉搜索树的判定、拓扑排序以及经典的n皇后回溯。
三道题的代码如下(#include是怕自己忘记包含的头文件):
2.1 判断二叉搜索树
只需要中序遍历,判断其是否递增即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
long pre=LONG_MIN;
bool Inorder(TreeNode* root){
if(root==NULL) return true;
bool l=Inorder(root->left);
if(root->val<=pre){
return false;
}
pre=root->val;
bool r=Inorder(root->right);
return l&&r;
}
bool isValidBST(TreeNode* root) {
return Inorder(root);
}
};
2.2 课程表(拓扑排序)
经典拓扑排序,即修一门课之间要先修另一门课,问题给的先后关系是否存在一个课表。只需要不断访问入度为0的点,访问后所有与该点有有向边的点入度减一即可。
#include<vector>
#include<queue>
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edge(numCourses,vector<int>(numCourses,0));
vector<int> Indegree(numCourses,0);
for(int i=0;i<prerequisites.size();i++){
edge[prerequisites[i][1]][prerequisites[i][0]]=1;
Indegree[prerequisites[i][0]]++;
}
queue<int> q;
//入度为0的点入队
for(int i=0;i<numCourses;i++){
if(Indegree[i]==0) q.push(i);
}
int visit=0;
while(!q.empty()){
//选择入度为0的点开始
int v=q.front();
//访问了q;
visit++;
q.pop();
//与v有边的点入度-1
for(int i=0;i<numCourses;i++){
if(edge[v][i]==1){
Indegree[i]--;
if(Indegree[i]==0) q.push(i);
}
}
}
return visit==numCourses;
}
};
2.3 n皇后问题
经典的回溯,依次按行放皇后,看是否有冲突,有冲突则回溯即可。
#include<string>
#include<vector>
#include<cmath>
class Solution {
public:
vector<vector<string>> ans;
vector<string> path;
vector<int> state;
bool conflict(int r,int j){
for(int i=0;i<r;i++){
if(state[i]==j||(abs(state[i]-j)==abs(r-i))){
return true;
}
}
return false;
}
void queue(int row,int n){
if(row==n){
ans.push_back(path);
return;
}
for(int j=0;j<n;j++){
if(!conflict(row,j)){
//记录当前行皇后的位置
state[row]=j;
//放置皇后
path[row][j]='Q';
queue(row+1,n);
path[row][j]='.';
state[row]=-1;
}
}
}
vector<vector<string>> solveNQueens(int n) {
path=vector<string>(n,string(n,'.'));
state=vector<int>(n,-1);
queue(0,n);
return ans;
}
};
3 结语
好累。。。。保研好累。。。