【LeetCode】拓扑排序

【207】 Course Schedule

排课问题,n门课排课,有的课程必须在另外一些课程之前上,问能不能排出来顺序。

题解:裸的拓扑排序。参考代码见算法竞赛入门指南这本书。

 1 class Solution {
 2 public:
 3     bool dfs(const vector<vector<int>>& g, vector<int>& c, int u) {
 4         c[u] = -1;
 5         for (int v = 0; v < n; ++v) {
 6             if (g[u][v]) {
 7                 if (c[v] < 0) { return false; }
 8                 else if (!c[v] && !dfs(g, c, v)) {
 9                     return false;
10                 }
11             }
12         }
13         c[u] = 1;
14         topo[--t] = u;
15         return true;
16     }
17     bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
18         vector<vector<int>> graph(numCourses, vector<int>(numCourses, 0));
19         n = numCourses;
20         topo.resize(n);
21         t = n;
22         for (auto ele : prerequisites) {
23             int u = ele.first, v = ele.second;
24             graph[v][u] = 1;
25         }
26         vector<int> c(n, 0);
27         for (int i = 0; i < n; ++i) {
28             if (!c[i]) {
29                 if (!dfs(graph, c, i)) {
30                     return false;
31                 }
32             }
33         }
34         /*
35         for (int i = 0; i < n; ++i) {
36             cout << topo[i] << " " ;
37         }
38         cout << endl;
39         */
40         return true;
41     }
42     vector<int> topo;
43     int n, t;
44 };
View Code

 

【210】 Course Schedule II

同上一个排课问题,这次的问题是能不能给出一个可行的顺序。

题解:还是裸的拓扑排序。

 1 class Solution {
 2 public:
 3     bool dfs(vector<int>& c, vector<int>& topo, int u) {
 4         c[u] = -1;
 5         for (int v = 0; v < n; ++v) {
 6             if (g[u][v]) {
 7                 if (c[v] < 0) {return false;}
 8                 else if (!c[v] && !dfs(c, topo, v)) {return false; }
 9             }
10         }
11         c[u] = 1;
12         topo[--t] = u;
13         return true;
14     }
15     vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
16         n = numCourses, t = n;
17         vector<int> topo(n, 0);
18         vector<int> c(n, 0);
19         vector<vector<int>> graph(n, vector<int>(n, 0));
20         for (auto ele : prerequisites) {
21             int u = ele.first, v = ele.second;
22             graph[v][u] = 1;
23         }
24         g = graph;
25             
26         for (int u = 0; u < n; ++u) {
27             if (!c[u]) {
28                 if (!dfs(c, topo, u)) {
29                     vector<int> temp;
30                     return temp;
31                 }
32             }
33         }
34         return topo;
35     }
36     int n, t;
37     vector<vector<int>> g;
38 };
View Code

 

【269】 Alien Dictionary

给了一门新的语言,给了一个单词字典,所有的单词按照字典序排序。要求返回现有字母的顺序,没有顺序的话,返回空数组。

题解:逐个比较两个相邻的单词,如果他们第i个位置不同,说明前一个单词的第i个字母u,要小于后一个单词的第i个字母v,然后建图,建完图直接裸的拓扑排序。

 1 class Solution {
 2 public:
 3     bool dfs(int u) {
 4         c[u] = -1;
 5         for (int v = 0; v < tot; ++v) {
 6             if (g[u][v]) {
 7                 if (c[v] < 0) {return false;}
 8                 else if (!c[v] && !dfs(v)) {return false;}
 9             }
10         } 
11         c[u] = 1;
12         topo[--cur] = u;
13         return true;
14     }
15     
16     string alienOrder(vector<string>& words) {
17         vector<pair<int, int>> order;
18         const int n = words.size();
19         int t = 0;
20         for (int i = 0; i < n; ++i) {
21             string word = words[i];
22             for (auto ele : word) {
23                 if (mpCh2Num.find(ele) == mpCh2Num.end()) {
24                     mpCh2Num[ele] = t;
25                     mpNum2Ch[t] = ele;
26                     ++t;
27                 }
28             }
29         }
30         c.resize(t), topo.resize(t);
31         tot = t; cur = t;
32   
33         for (int i = 0; i < n - 1; ++i) {
34             string word1 = words[i], word2 = words[i+1];
35             for (int idx = 0; idx < min(word1.size(), word2.size()); ++idx) {
36                 if (word1[idx] != word2[idx]) {
37                     pair<int, int> p = make_pair(mpCh2Num[word1[idx]], mpCh2Num[word2[idx]]);
38                     order.push_back(p);
39                     break;
40                 }
41             }
42         }
43 
44         vector<vector<int>> graph(t, vector<int>(t, 0));
45         for (auto ele : order) {
46             int u = ele.first, v = ele.second;
47             graph[u][v] = 1;
48         }
49         g = graph;
50 
51         for (int u = 0; u < t; ++u) {
52             if (!c[u]) {
53                 if (!dfs(u)) {
54                     string temp;
55                     return temp;
56                 }
57             }
58         }
59         string ans;
60         for (auto ele : topo) {
61             ans += mpNum2Ch[ele];
62         }
63         return ans;
64     }
65     vector<vector<int>> g;
66     vector<int> c, topo;
67     map<int, char> mpNum2Ch;
68     map<char, int> mpCh2Num;
69     int tot;
70     int cur;
71 };
View Code

 

【329】 Longest Increasing Path in a Matrix

给了一个矩阵matrix, 一个点他可以朝着上下左右四个方向走,问这个矩阵能走出来的最长递增的路径的长度是多少。

题解:裸的dfs会超时,所以加上了一个记忆化数组过了。题目的解法三有拓扑排序的相关解法,下次要搞懂那个解法。

 1 class Solution {
 2 public:
 3     void print(vector<vector<int>>& mat) {
 4         const int n = mat.size(), m = mat[0].size();
 5         for (int i = 0; i < n; ++i) {
 6             for (int j = 0; j < m; ++j) {
 7                 cout << mat[i][j] << " ";
 8             }
 9             cout << endl;
10         }
11     }
12     int dirx[4] = {-1, 0, 1, 0};
13     int diry[4] = {0, -1, 0, 1};
14     int dfs(const vector<vector<int>>& mat, int x, int y, vector<vector<int>>& vis) {
15         vis[x][y] = 1;
16         for (int i = 0; i < 4; ++i) {
17             int newx = x + dirx[i], newy = y + diry[i];
18             if (newx >= 0 && newx < n && newy >= 0 && newy < m && !vis[newx][newy]&& mat[newx][newy] > mat[x][y]) {
19                 if (memo[newx][newy] != 0) {
20                     memo[x][y] = max(memo[x][y], memo[newx][newy] + 1);
21                 } else {
22                     memo[x][y] = max(memo[x][y], dfs(mat, newx, newy, vis) + 1);
23                 }
24             }
25         }
26         vis[x][y] = 0;
27         return memo[x][y];
28     }
29     int longestIncreasingPath(vector<vector<int>>& matrix) {
30         n = matrix.size();
31         if (n == 0) { return 0; }
32         m = matrix[0].size();
33         if (m == 0) { return 0; }
34         
35         int ans = 0;
36         memo = matrix;
37         for (int i = 0; i < n; ++i) {
38             for (int j = 0; j < m; ++j) {
39                 memo[i][j] = 0;
40             }
41         }
42         
43         for (int i = 0; i < n; ++i) {
44             for (int j = 0; j < m; ++j) {
45                 vector<vector<int>> vis(n, vector<int>(m, 0));
46                 memo[i][j] = dfs(matrix, i, j, vis);
47                 ans = max(ans, memo[i][j]);
48             }
49         }
50         return ans  +1;
51     }
52     int n, m;
53     vector<vector<int>> memo;
54 };
View Code

  

【444】 Sequence Reconstruction

转载于:https://www.cnblogs.com/zhangwanying/p/9655103.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm中更新pip版本的问题

经常使用Python的都知道pip&#xff0c;但有时候&#xff0c;下载某个模块不成功&#xff0c;提示信息如下 pytharm查看自带的pip版本 解决方式一&#xff1a; pytharm的terminal里卸载pip再安装pip 如果还不行&#xff0c;解决方式二 去你当前的项目路径下找到lib文件夹下的…

小程序的wx.onAccelerometerChange

https://www.2cto.com/kf/201802/724174.html&#xff08;copy&#xff09; 也许有人会问&#xff0c;小程序中都是竖直app形态&#xff0c;要横竖屏判断有什么用?即使判断出了横屏状态&#xff0c;你能把小程序横过来?答案是不能的&#xff0c;但是判断当前设备处于横屏或者…

Django通过中间件实现登录验证demo

前提&#xff1a;中间件版的登录验证需要依靠session&#xff0c;所以数据库中要有django_session表。 1 from django.conf.urls import url2 from django.contrib import admin3 from app01 import views4 5 urlpatterns [6 url(r^admin/, admin.site.urls),7 url(r^…

Python爬虫自学之第(③)篇——实战:requests+BeautifulSoup实现静态爬取

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 前篇全片都是生硬的理论使用&#xff0c;今天就放个静态爬取的实例让大家体验一下B…

Python爬虫自学之第(④)篇——强大的正则表达式,re模块

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 如果把BeautifulSopu比喻成通过线索一步步接近目标的侦探的话&#xff0c;那么正则…

Python爬虫自学之第(⑤)篇——爬取某宝商品信息

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 能看到这里说明快进入动态网页爬取了&#xff0c;在这之前还有一两个知识点要了解&…

Vue通信、传值的多种方式,详解

Vue通信、传值的多种方式&#xff0c;详解 转自&#xff1a;https://blog.csdn.net/qq_35430000/article/details/79291287 一、通过路由带参数进行传值 ①两个组件 A和B,A组件通过query把orderId传递给B组件&#xff08;触发事件可以是点击事件、钩子函数等&#xff09; this.…

python 文件读写(追加、覆盖)

很明了的一个常用参数图标&#xff1a; 更像细的一个参数说明&#xff1a; 由于文件读写时都有可能产生IOError&#xff0c;一旦出错&#xff0c;后面的f.close()就不会调用。所以&#xff0c;为了保证无论是否出错都能正确地关闭文件&#xff0c;我们可以使用try ... finally来…

前端知识点总结

1、DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。(通俗易懂的来讲讲DOM、两个节点之间可能存在哪些关系以及如何在节点之间任意移动) DOM: Document Object Module, 文档对象模型。 节点的关系:父(parent)、子(child)和同胞(sibling)等节…

Python爬虫自学之第(①)篇——爬虫伪装和反“反爬”

有些网站是防爬虫的。其实事实是&#xff0c;凡是有一定规模的网站&#xff0c;大公司的网站&#xff0c;或是盈利性质比较强的网站&#xff0c;都是有高级的防爬措施的。总的来说有两种反爬策略&#xff0c;要么验证身份&#xff0c;把虫子踩死在门口&#xff1b;要么在网站植…

Spring 事务相关及@Transactional的使用建议

使用步骤&#xff1a; 步骤一、在spring配置文件中引入<tx:>命名空间<beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:tx"http://www.springframework.org/schema/…

谷歌浏览器安装Vue Devtools插件(国内的谷歌浏览器如何安装插件)

分享给大家一个谷歌插件网站&#xff0c;适合国内谷歌浏览器无法安装插件的问题&#xff0c;你懂的 点击这里下载Vue.js Devtools插件&#xff0c; 喜欢的可以收藏这个插件资源网站&#xff0c;分享给大家 第一步&#xff1a;下载后解压获得CRX文件&#xff0c;如下图 第二步…

MySQL操作权限整理

用户权限管理主要有以下作用&#xff1a; 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一、用户授权 mysql> grant a…

vue报错 TypeError: merge is not a function

利用ncu -u升级去年的vue项目package.json里的所有依赖&#xff0c;目的是想增删改它去做另一个项目&#xff0c; 却发生了这样一个错误&#xff1a;&#xff08;如下&#xff09; 查找问题原因&#xff1a; 这是webpack配置中区分环境配置文件中的插件webpack-merge的报错&a…

Invalid options object. Copy Plugin has been initialized using an options object that does not match

报错&#xff1a; 报错文件和代码&#xff1a;查看了官网也没有看出所以然&#xff0c;最后在npm官网上找打了原因 错误配置&#xff1a; 怎么看都没有错误 最后参看一下这个npn官网找打了原因&#xff0c;地址&#xff1a;https://www.npmjs.com/package/copy-webpack-plugin …

后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column

今天基于这个问题纠结了一下午&#xff0c;导致这个问题的坑也是挺深的&#xff0c;查找问题最好是从这条数据的存储开始查找 问题1&#xff1a;先确定后台接收数据后存储到数据库里有没有自动转义特殊字符&#xff0c;比如 原始数据是&#xff1a;[{"user_id":20,…

Java开发框架和中间件面试题(4)

27.如何自定义Spring Boot Starter&#xff1f; 1.实现功能 2.添加Properties 3.添加AutoConfiguration 4.添加spring.factory 在META INF下创建spring.factory文件 6.install 28.为什么需要spring boot maven plugin? spring boot maven plugin 提供了一些像jar一样打包…

第二周每周例行报告

1.本周PSP 类型任务开始时间结束时间间隔时间净时间准备工作复习C#&#xff0c;看书2018.9.19 17&#xff1a;032018.9.19 18&#xff1a;17 0min74min编程编写功能一2018.9.20 18&#xff1a;072018.9.20 22&#xff1a;4323min253min编程完善修改功能一2018.9.21…

poj 1083 Moving Tables

题目 两种做法&#xff0c;开始用贪心做的&#xff0c;有种情况没考虑到&#xff0c;结果排序错了。 这个例子&#xff0c;感觉上有三个交点&#xff0c;以为是30&#xff0c;其实是20. 贪心代码&#xff1a; #include <iostream> #include <cstdio> #include <…

oracle parallel_index hint在非分区表的生效

之前没特别注意&#xff0c;在有些场景下希望使用并行索引扫描的时候&#xff0c;发现parallel_index hint并没有生效&#xff0c;于是抽空看了下文档&#xff1a;The PARALLEL_INDEX hint instructs the optimizer to use the specified number of concurrent servers to para…