leetcode 27场双周赛思路
由于没时间参加 这里说下思路
1 通过翻转子数组使两个数组相等 比较两个数组是否能够通过转换子数组获得 其实就是比对里面的元素是否相同 排序并比较就好了
class Solution { public: bool canBeEqual(vector<int>& target, vector<int>& arr) { sort(target.begin(),target.end()); sort(arr.begin(),arr.end()); return target==arr; } };
2 检查一个字符串是否包含所有长度为 K 的二进制子串 根据指定的长度 用双指针记录获取的字符串 如果获取的类型数目 等于改长度01能组成的所有类型 则说明包含
这里放一个很简短的代码 缺点是可能运行时间太长 后期可能会被判定tle
class Solution { public: bool hasAllCodes(string s, int k) { unordered_set<string> ss; for(int l =0;l<s.size();l++){ int r = l+k-1; if(r>= s.size()) break; ss.insert(s.substr(l,k)); if(ss.size() == 1<<k) return true; } return ss.size() == 1<<k; } };
3 课程安排 IV 闭包传递。这里使用的是哈希记录每个点的先修点,加速查找
1 class Solution { 2 public: 3 4 vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) { 5 unordered_map<int, unordered_set<int>> ms(n + 10); 6 7 for (auto& e : prerequisites) { 8 int a = e[0]; 9 int b = e[1]; 10 11 ms[b].insert(a); 12 } 13 vector<bool> ret; 14 int vis[110] = { 0 }; 15 for (auto& e : queries) { 16 int a = e[0]; 17 int b = e[1]; 18 memset(vis, 0, sizeof(vis)); 19 20 if (ms[b].count(a) != 0) { 21 ret.push_back(true); 22 continue; 23 } 24 queue<int> Q; 25 for (auto& e : ms[b]) { 26 Q.push(e); 27 } 28 int find = 0; 29 //bfs查找 30 while (!Q.empty()) { 31 int ele = Q.front(); Q.pop(); 32 if (vis[ele] == 1) continue; 33 vis[ele] = 1; 34 if (ms[ele].count(a) != 0) { 35 ret.push_back(true); 36 find = 1; 37 break; 38 } 39 40 for (auto& e : ms[ele]) { 41 Q.push(e); 42 } 43 } 44 if (find == 0) { 45 ret.push_back(false); 46 } 47 48 } 49 50 51 return ret; 52 } 53 54 };
上面的代码现在判定为TLE了 超时 过不了。
我们也可以使用floyd算法,计算每个点之间是否有路线可以到达即可
class Solution { public: vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) { vector<vector<int>> graph(150,vector<int>(150,99990)); for(int i =0;i < prerequisites.size();i++){ int a = prerequisites[i][0]; int b = prerequisites[i][1]; graph[a][b] = 1; } for (int k = 0; k < n; k ++ ) for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]); vector<bool> ret; for(int i = 0; i < queries.size();i++ ){ int a = queries[i][0]; int b = queries[i][1]; if(graph[a][b] > 99990/2){ ret.push_back(false); }else{ ret.push_back(true); } } return ret; } };
4 摘樱桃 II 动态规划
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力