Day9——LeetCode51&98&207

1 前言

  今天睡了太久中午起来打算刷LeetCode每日一题,结果做了半天没做出来,看了题解头都大了,然后接着就是头昏脑胀,晚上才开始刷题。我吐槽一下,LeetCode你想干嘛呢,才刷了几天题推那么难(2338)。

2 水水水水

  刷题坚持下去了但写博客太耗时间了,实在不想写了,以后也不会在写题解了,最多记录一下。
  今天刷了三道题,分别是二叉搜索树的判定、拓扑排序以及经典的n皇后回溯。
1
  三道题的代码如下(#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 结语

  好累。。。。保研好累。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值