5480. 可以到达所有点的最少点数目 #贪心

题目链接

题意

给定有向无环图,编号从0n-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进行两类操作:

  1. 对数组某个元素进行自增
  2. 对数组每个元素的值*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 题解的更多相关文章

  1. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  2. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  3. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  4. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  5. LeetCode双周赛#36

    1604. 警告一小时内使用相同员工卡大于等于三次的人 题目链接 题意 给定两个字符串数组keyName和keyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24 ...

  6. LeetCode双周赛#35

    1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...

  7. LeetCode双周赛#34

    5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...

  8. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  9. Leetcode 10. 正则表达式匹配 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

随机推荐

  1. puk2367 拓扑排序

    Description The system of Martians' blood relations is confusing enough. Actually, Martians bud when ...

  2. 云计算管理平台之OpenStack镜像服务glance

    一.glance简介 openstack中的glance服务是用来存储在openstack上启动虚拟机所需镜像:它主要用于发现.注册及检索虚拟机镜像:它通过提供RESTful风格的api对外提供服务: ...

  3. 一起学Vue:访问API(axios)

    目标 使用Vue+ElementUI+axios构建一个非常简单CRUD应用程序,以便您更好地了解它的工作方式. 什么是 axios? Axios 是一个基于 promise 的 HTTP 库,可以用 ...

  4. Github优质库分享-01算法小抄 基于LeetCode

    Github 优质库分享-01 算法小抄 该库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌. 目前 sta ...

  5. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

  6. 作为servlet容器的hi-nginx-java

    hi-nginx-java是一个独立于java官方的servlet规范,它有能力把NGINX直接编成servlet容器服务器.换言之,无需安装tomcat等容器服务器,也无需使用nginx的反向代理功 ...

  7. python08豆瓣电影 爬虫 BeautifulSoup + Reuqests

    主要思路 请求豆瓣的链接获取网页源代码 然后使用 BeatifulSoup 拿到我们要的内容 最后就把数据存储到 excel 文件中

  8. python语言编程算法

    编程题 1 台阶问题/斐波那契 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. fib = lambda n: n if n <= 2 else fi ...

  9. 搭建面向NET Framework的CI/CD持续集成环境(一)Windows服务器安装Jenkins

    前言 网上大多数都是针对主流的Spring Cloud.NET Core的CI/CD方案.但是目前国内绝大部分的公司因为一些历史原因无法简单的把项目从NET Framework切换升级到NET Cor ...

  10. Tensorflow学习---argmax中axis问题

    一:argmax中axis问题 https://blog.csdn.net/qq575379110/article/details/70538051/ 总之:axis=0/1不是行/列关系 test ...