LeetCode双周赛#33 题解
5480. 可以到达所有点的最少点数目 #贪心
题目链接
题意
给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发,能够到达图中所有顶点。
样例

输出为[0, 2, 3]。从这三个顶点出发即能访问所有顶点。
分析
实际上,只需要将所有入度为0的顶点加入解集即可。因为:1.入度为0的顶点若不加入解集,则除了它以外,没有其他顶点能够沿途访问到它。2.入度不为0的顶点一定能被某个顶点沿途访问到,为了保证解集尽可能小,那应尽可能从这些入度非0的顶点溯源。
class Solution {
private:
int InD[100005] = { 0 };
public:
vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges) {
for (int i = 0; i < edges.size(); i++) {
int cur = edges[i][1];
InD[cur]++;
}
vector<int> ans;
for (int i = 0; i < n; i++) {
if (InD[i] == 0) {
ans.push_back(i);
}
}
return ans;
}
};
5481. 得到目标数组的最少函数调用次数 #逆向思维 #贪心
题目链接
题意
你可以对数组arr进行两类操作:
- 对数组某个元素进行自增
- 对数组每个元素的值
*2
先给定一个nums大小相同且初始值全为0的数组arr,现要求需要多少次操作能将arr转变为nums。
分析
本题看似较为麻烦,实际上逆向去思考,如果当前数组存在奇数,上一次操作必然不是*2而只能是对某个数进行自增;如果当前数组全为偶数,由贪心思维,若上一次操作是对数组所有元素都进行*2,能够保证操作次数不会太多。
class Solution {
public:
int minOperations(vector<int>& nums) {
int ans = 0;
while(1){
bool f = false;
int cnt = 0;
for (int i = 0; i < nums.size(); i++){
if(nums[i] % 2 == 1){
ans++;
nums[i]--;
f = true; /*说明当前数组存在奇数*/
}
if(nums[i] == 0) cnt++;
}
if(cnt == nums.size()) break;
if(f == false){ /*说明当前数组全为偶数*/
for(int i = 0; i < nums.size(); i++){
nums[i] >>= 1;
}
ans++;
}
}
return ans;
}
};
5482. 二维网格图中探测环 #暴力搜索
题目链接
题意
给定二维字符网格数组grid,大小\(n\times m(n,m\leq500)\),需检查grid是否存在相同值形成的环。
其中环的定义是,一条开始和结束于同一个格子的长度 大于等于 4 的路径。而这条路径只能上、下、左、右四个方向移动,不能斜向移动。
样例
输入:grid = [["c","c","c","a"],["c","d","c","c"],["c","c","e","c"],["f","c","c","c"]]

输出:true
分析
考虑到数据范围不是太大,可以枚举二维矩阵每个元素作为起点。然后从该起点出发,搜索可以延伸的路径,直到碰到原来起点或者原来访问过的节点。
class Solution {
private:
int di[5] = { 0, 0, 1, 0, -1 };
int dj[5] = { 0, 1, 0, -1, 0 };
int vis[505][505] = { 0 };
public:
bool dfs(vector<vector<char>>& grid, int x, int y, int prex, int prey, int begx, int begy) { //(x,y)表示当前点,(prex,prey)表示上一转移的点,(begx,begy)表示原来起点
vis[x][y] = 1;
int n = grid.size(), m = grid[x].size();
for (int t = 1; t <= 4; t++) {
int curx = x + di[t], cury = y + dj[t];
if (prex == curx && prey == cury) continue; //防止回退
else if (0 > curx || curx >= n || 0 > cury || cury >= m) continue; //防止越界
else if (curx == begx && cury == begy) return true; //抵达起点
else if (grid[curx][cury] == grid[x][y]) { //相同字符的条件下
if (vis[curx][cury]) return true; //别忘了该条语句。说明点(x,y)周围遇到相同字符的元素,可以形成环。减少时间复杂度
if (dfs(grid, curx, cury, x, y, begx, begy)) return true;//再搜索
} //不需要回溯,将原来访问过的节点进行状态重置,否则会超时
}
return false;
}
bool containsCycle(vector<vector<char>>& grid) {
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
if (!vis[i][j] && dfs(grid, i, j, -1, -1, i, j))
return true;
return false;
}
};
LeetCode双周赛#33 题解的更多相关文章
- Leetcode 双周赛#32 题解
1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...
- leetcode 双周赛9 进击的骑士
一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...
- leetcode 双周赛9 找出所有行中最小公共元素
给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...
- [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和
题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...
- LeetCode双周赛#36
1604. 警告一小时内使用相同员工卡大于等于三次的人 题目链接 题意 给定两个字符串数组keyName和keyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24 ...
- LeetCode双周赛#35
1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...
- LeetCode双周赛#34
5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- Leetcode 10. 正则表达式匹配 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
随机推荐
- html2canvas.js——HTML转Canvas工具
我们经常会遇上动态生成海报的需求,而在Web前端中,生成图片非Canvas莫属.但是在实际工作当中,为了追求效率,我们会不可避免地去使用一些JS插件,而html2canvas.js就是一款优秀的插件, ...
- JWT安装配置
1.1 安装JWT pip install djangorestframework-jwt==1.11.0 1.2 syl/settings.py 配置jwt载荷中的有效期设置 import date ...
- 模块导入from collections import Iterator,Iterable失败
1.引入模块报错 from collections import Iterator,Iterable 报错: DeprecationWarning: Using or importing the AB ...
- 白话科普,10s 了解 API
作为一名又拍云的技术支持工程师,小拍每天都会接收到很多客户的提问.这其中,有很多客户会问:"小拍,请问云存储上传除了使用控制台的文件管理和 FTP 工具之外,有没有其他的途径进行上传呢?&q ...
- Git的介绍及使用
一.配置用户信息: 配置用户名和邮箱: $ git config --global user.name "chunyu" $ git config --global user.em ...
- OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...
- 我的第二次C语言作业
这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-2/homework/11422 这个作业要求在哪里 https://www.cnblog ...
- Git--gitLab远程仓库分支代码回退的两种方案
事由:作为仓库的master,一时老眼昏花,把同事说的不合并看成了合并,直接合并了. 解决方法: 一.粗鲁的代码回退--直接在远程仓库合并 1. 在gitLab远程仓库中,基于想回退的代码的节点(co ...
- python实现对于告警规则的判断思路
场景 监控一个后台服务各个url的响应时间,需要在mysql数据库的一张表中设计一个字段需要包含且不仅限于以下一种规则(1. 大于 2. 小于 3. 大于等于 4. 小于等于),表结构大概是这样的 每 ...
- 使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared objec ...