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 ...
随机推荐
- 撤销rebase与git原理
git对象 git是面向对象的,对象存储在.git/objects文件夹中.此文件夹中,一个对象就是一个文件,文件名就是对象的id 提交commit的时候,每个文件都是一个数据对象,一个树对象会用来维 ...
- array_walk_recursive 地址引用报错的问题
今天看十八哥的视频,学习array_walk_recursive的用法,发现一直报错: PHP版本:5.6.19 代码界面: 报错界面: 查了很长时间,不知道什么问题,后来在网上终于找到原因所在: + ...
- LuoguP3615 如厕计划
题面 现有两个厕所,一个女士专用,一个通用,给出\(2*n\)个排成一列的人的性别 每人如厕需要一分钟,假如女厕是空的,女生中最靠前的可以直接进入. 需要通过调换顺序使得所有人都上完厕所最后的时间为n ...
- Java学习的第四十五
1.例5.7求三个字符串中的最大值 import java.util.Scanner; public class Cjava { public static void main(String[]arg ...
- nginx处理vue打包文件后的跨域问题
起因 在vue文件打包后,项目脱离了vue配置的反向代理配置,还是会报跨域的错误,或者直接打不开本地文件, 但是此刻我们想打开打包后的文件,测试一下文件有没有错误,因为经常会存在开发阶段没有问题,打包 ...
- mysql 快速清除数据表数据
mysql> truncate tables; 例如: mysql> truncate email_managements;
- C语言经典100例-ex001
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- Ideas and Tricks Part II
33.对于统计答案幂次的技巧 对于$x^k$,考虑其组合意义:将$k$个不同球放到$x$个不同的盒子里的方案数,直接维护不好维护,那么考虑枚举把这些球放到了哪些盒子里,最后乘上第二类斯特林数和对于的阶 ...
- Unity正交相机智能包围物体(组)方案
Unity正交相机智能包围物体(组)方案 目录 Unity正交相机智能包围物体(组)方案 一.技术背景 二.相关概念 2.1 正交摄像机 2.2 正交相机的Size 2.3 相机的Aspect 2.4 ...
- C++ 数据结构 2:栈和队列
1 栈 1.1 栈的基本概念 栈(stack)又名堆栈,它是一种 运算受限的线性表.限定 仅在表尾进行插入和删除操作 的线性表.表尾被称为栈顶,相对地,把另一端称为栈底. 1.1.1 特点 它的特殊之 ...