LeetCode 第 187 场周赛(1336/3107,前43.0%)

文章目录

    • 1. 比赛结果
    • 2. 题目
      • 1. LeetCode 5400. 旅行终点站 easy
      • 2. LeetCode 5401. 是否所有 1 都至少相隔 k 个元素 medium
      • 3. LeetCode 5402. 绝对差不超过限制的最长连续子数组 medium
      • 4. LeetCode 5403. 有序矩阵中的第 k 个最小数组和 hard

1. 比赛结果

15分钟做出来了 1、2 题,第3题卡了,第4题没做,继续加油!冲啊!

全国排名:1336 / 3107,43.0%;全球排名:5345 / 12349,43.3%
在这里插入图片描述
在这里插入图片描述

2. 题目

1. LeetCode 5400. 旅行终点站 easy

题目链接
给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。
请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。

题目数据保证线路图会形成一条不存在循环的线路,因此只会有一个旅行终点站。

示例 1:
输入:paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]
输出:"Sao Paulo" 
解释:从 "London" 出发,最后抵达终点站 "Sao Paulo" 。
本次旅行的路线是 "London" -> "New York" -> "Lima" -> "Sao Paulo" 。示例 2:
输入:paths = [["B","C"],["D","B"],["C","A"]]
输出:"A"
解释:所有可能的线路是:
"D" -> "B" -> "C" -> "A". 
"B" -> "C" -> "A". 
"C" -> "A". 
"A". 
显然,旅行终点站是 "A" 。示例 3:
输入:paths = [["A","Z"]]
输出:"Z"提示:
1 <= paths.length <= 100
paths[i].length == 2
1 <= cityAi.length, cityBi.length <= 10
cityAi != cityBi
所有字符串均由大小写英文字母和空格字符组成。

解答:

class Solution {
public:string destCity(vector<vector<string>>& paths) {unordered_set<string> dist;unordered_set<string> start;for(auto p : paths){start.insert(p[0]);//加入起点if(dist.count(p[0]))//目的地包含出发dist.erase(p[0]);//删除if(!start.count(p[1]))//不是起点dist.insert(p[1]);//插入终点集合else//p[1]是起点{if(dist.count(p[1]))dist.erase(p[1]);//终点中删除}}return *dist.begin();}
};

32 ms 11.6 MB


赛后另解:图的出入度概念,终点,只有入度,出度为0

class Solution {
public:string destCity(vector<vector<string>>& paths) {unordered_map<string,int> in;unordered_map<string,int> out;for(auto p : paths){out[p[0]]++;in[p[1]]++;}for(auto in_ : in){if(out[in_.first]==0)return in_.first;}return "";}
};

2. LeetCode 5401. 是否所有 1 都至少相隔 k 个元素 medium

题目链接
给你一个由若干 0 和 1 组成的数组 nums 以及整数 k。
如果所有 1 都至少相隔 k 个元素,则返回 True ;否则,返回 False 。

示例 1:
在这里插入图片描述

输入:nums = [1,0,0,0,1,0,0,1], k = 2
输出:true
解释:每个 1 都至少相隔 2 个元素。示例 2:
输入:nums = [1,0,0,1,0,1], k = 2
输出:false
解释:第二个 1 和第三个 1 之间只隔了 1 个元素。示例 3:
输入:nums = [1,1,1,1,1], k = 0
输出:true示例 4:
输入:nums = [0,1,0,1], k = 1
输出:true提示:
1 <= nums.length <= 10^5
0 <= k <= nums.length
nums[i] 的值为 01

解答:

  • 先把 1 的位置存下来,然后再遍历位置,检查相邻的差值
class Solution {
public:bool kLengthApart(vector<int>& nums, int k) {bool flag = true;int i, count = 0, prev = -1;vector<int> pos;for(i = 0; i < nums.size(); ++i){if(nums[i] == 1)pos.push_back(i);}for(i = 0; i < int(pos.size())-1; ++i){if(pos[i+1]-pos[i] <= k){flag = false;break;}}return flag;}
};

176 ms 60.2 MB


或者直接遍历,节省空间,

class Solution {
public:bool kLengthApart(vector<int>& nums, int k) {int i, prevOneIdx = -1000000;for(i = 0; i < nums.size(); ++i){if(nums[i] == 1){if(i-prevOneIdx <= k)return false;prevOneIdx = i;}}return true;}
};

184 ms 57.6 MB

3. LeetCode 5402. 绝对差不超过限制的最长连续子数组 medium

题目链接
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。

如果不存在满足条件的子数组,则返回 0 。

示例 1:
输入:nums = [8,2,4,7], limit = 4
输出:2 
解释:所有子数组如下:
[8] 最大绝对差 |8-8| = 0 <= 4.
[8,2] 最大绝对差 |8-2| = 6 > 4. 
[8,2,4] 最大绝对差 |8-2| = 6 > 4.
[8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
[2] 最大绝对差 |2-2| = 0 <= 4.
[2,4] 最大绝对差 |2-4| = 2 <= 4.
[2,4,7] 最大绝对差 |2-7| = 5 > 4.
[4] 最大绝对差 |4-4| = 0 <= 4.
[4,7] 最大绝对差 |4-7| = 3 <= 4.
[7] 最大绝对差 |7-7| = 0 <= 4. 
因此,满足题意的最长子数组的长度为 2 。示例 2:
输入:nums = [10,1,2,4,7,2], limit = 5
输出:4 
解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。示例 3:
输入:nums = [4,2,2,2,4,4,2,2], limit = 0
输出:3提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9

解题:

  • 双指针,滑动窗口,窗口内的数为了快速获取最大最小值,采用multimap存储
  • 一旦加入的数跟MAX,MIN做差,不在范围内,左端点向右移动,并删除map内的该值
class Solution {
public:int longestSubarray(vector<int>& nums, int limit) {multimap<int,int> m;//value, idxint i = 0, j, MAX, MIN, maxlen = 1;for(j = 0; j < nums.size(); ++j){m.insert(make_pair(nums[j],j));MIN = m.begin()->first;//map有序MAX = (--m.end())->first;if(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit){maxlen = max(maxlen, int(m.size()));}while(!(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)){auto it = m.lower_bound(nums[i++]);m.erase(it);MIN = m.begin()->first;MAX = (--m.end())->first;}}return maxlen;}
};

276 ms 47.1 MB


参考 大佬IK哥的解:
自己写了下,采用map计数的方式

class Solution {
public:int longestSubarray(vector<int>& nums, int limit) {map<int,int> m;//value, count计数int i = 0, j = 0, MAX, MIN, maxlen = 1;while(j < nums.size()){m[nums[j]]++;//计数MIN = m.begin()->first;MAX = (--m.end())->first;if(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)maxlen = max(maxlen, j-i+1);else{while(!(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)){m[nums[i]]--;if(m[nums[i]]==0)m.erase(nums[i]);i++;MIN = m.begin()->first;MAX = (--m.end())->first;}}j++;}return maxlen;}
};

232 ms 39 MB

4. LeetCode 5403. 有序矩阵中的第 k 个最小数组和 hard

题目链接
给你一个 m * n 的矩阵 mat,以及一个整数 k ,矩阵中的每一行都以非递减的顺序排列。

你可以从每一行中选出 1 个元素形成一个数组。
返回所有可能数组中的第 k 个 最小 数组和。

示例 1:
输入:mat = [[1,3,11],[2,4,6]], k = 5
输出:7
解释:从每一行中选出一个元素,前 k 个和最小的数组分别是:
[1,2], [1,4], [3,2], [3,4], [1,6]。其中第 5 个的和是 7 。  示例 2:
输入:mat = [[1,3,11],[2,4,6]], k = 9
输出:17示例 3:
输入:mat = [[1,10,10],[1,4,5],[2,3,6]], k = 7
输出:9
解释:从每一行中选出一个元素,前 k 个和最小的数组分别是:
[1,1,2], [1,1,3], [1,4,2], [1,4,3], [1,1,6], [1,5,2], [1,5,3]。其中第 7 个的和是 9 。 示例 4:
输入:mat = [[1,1,10],[2,2,9]], k = 7
输出:12提示:
m == mat.length
n == mat.length[i]
1 <= m, n <= 40
1 <= k <= min(200, n ^ m)
1 <= mat[i][j] <= 5000
mat[i] 是一个非递减数组

解答:
参考 IK 哥 的解答:

  • 暴力解法
  • 把第一行跟第二行,两两相加,取最小的 k 个出来
  • 把这些再跟第三行两两相加,重复下去
class Solution {
public:int kthSmallest(vector<vector<int>>& mat, int k) {vector<int> ans(mat[0]);int i, j, ki;for(i = 1; i < mat.size(); ++i){multiset<int> s;for(j = 0; j < mat[i].size(); ++j){for(ki = 0; ki < ans.size(); ++ki)s.insert(mat[i][j]+ans[ki]);}ans.assign(s.begin(),s.end());ans.resize(min(k, int(ans.size())));}return ans[k-1];}
};

1736 ms 156.3 MB


优先队列解题

在这里插入图片描述

struct cmp
{bool operator()(const pair<int,vector<int>>& a, const pair<int,vector<int>>& b) const{return a.first > b.first;//小顶堆,和小的在堆顶}
};
class Solution {
public:int kthSmallest(vector<vector<int>>& mat, int k) {pair<int,vector<int>> tp;int i, j, s0 = 0, m = mat.size(), n = mat[0].size(), s;for(i = 0; i < m; ++i)s0 += mat[i][0];//最小的和vector<int> idx(m,0);//每行选取的下标vector<int> tempidx;priority_queue<pair<int,vector<int>>, vector<pair<int,vector<int>>>,cmp> q;q.push({s0,idx});set<vector<int>> visited;visited.insert(idx);//访问过了while(--k){tp = q.top();s0 = tp.first;idx = tp.second;q.pop();for(i = 0; i < m; ++i){tempidx = idx;tempidx[i]++;//该行变大一点if(tempidx[i] < n && !visited.count(tempidx))//没有访问过该状态{s = s0-mat[i][idx[i]]+mat[i][idx[i]+1];//DP思路求解下一次的和visited.insert(tempidx);q.push({s,tempidx});}}}return q.top().first;}
};

568 ms 43.4 MB

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

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

相关文章

场景编辑器竣工!

今天接着做XML解析&#xff0c;对那个遍历的结构作了些修改&#xff0c;插入了几个函数。 终于&#xff0c;新的场景编辑器竣工了&#xff01; 一个比较复杂的场景了&#xff0c;用3dsMax制作材质&#xff0c;安排物件位置和所用材质 导出到DirectX中&#xff0c;效果感觉比Max…

将MathType公式转换为Blog可用的LaTeX公式(MD编辑器)

会LaTex语法的同学敲起来还是会快一些的。 符号参考&#xff1a; LaTeX 各种命令&#xff0c;符号Latex所有常用数学符号整理 不会的同学&#xff0c;可以按照以下方式操作&#xff1a; 在MathType内先敲好公式 可以手敲&#xff0c;也可以手写&#xff08;手写调用windows的…

JQuery + Json 练习随笔

早就听说JQuery Ajax的方便快捷以及Json优秀的数据交换&#xff0c;今天有空尝试了一下&#xff0c;菜鸟了一番。对初步的使用也算是有个比较抽象的理解吧。记录之备忘&#xff01; json简介&#xff1a; JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人…

LeetCode 313. 超级丑数(动态规划)

1. 题目 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。 示例: 输入: n 12, primes [2,7,13,19] 输出: 32 解释: 给定长度为 4 的质数列表 primes [2,7,13,19]&#xff0c; 前 12 个超级丑数序列为&#xf…

Visual Studio 2010 旗舰版免序列号安装体验

Visual Studio 2010 E文版已经发布多时&#xff0c;由于工作原因没有及早的下载体验&#xff0c;直到前几天园子里的朋友放出了下载简体中文的种子 ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/于是决定下来…

潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)

文章目录1. 狄利克雷分布2. 潜在狄利克雷分配模型3. 学习推理4. sklearn.decomposition.LatentDirichletAllocation潜在狄利克雷分配&#xff08;latent Dirichlet allocation&#xff0c;LDA&#xff09;&#xff0c;作为基于 贝叶斯学习的话题模型&#xff0c;是潜在语义分析…

LeetCode 983. 最低票价(动态规划)

1. 题目 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。 在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出。 每一项是一个从 1 到 365 的整数。 火车票有三种不同的销售方式&#xff1a; 一张为期一天的通行证售价为 co…

LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)

1. 题目 这里有一个非负整数数组 arr&#xff0c;你最开始位于该数组的起始下标 start 处。 当你位于下标 i 处时&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 任意 下标处。 注意&#xff0c;不管是什么情况下&#xff…

mysql错误日志为aborting_MySQL 错误日志(Error Log)

同大多数关系型数据库一样&#xff0c;日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件。通常包括错误日志文件&#xff0c;二进制日志&#xff0c;通用日志&#xff0c;慢查询日志&#xff0c;等等。这些日志能够帮助我们定位mysqld内部发生的事件&#xff0…

LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 让我们一起来玩扫雷游戏&#xff01; 给定一个代表游戏板的二维字符矩阵。 ‘M’ 代表一个未挖出的地雷&#xff0c; ‘E’ 代表一个未挖出的空方块&#xff0c; ‘B’ 代表没有相邻&#xff08;上&#xff0c;下&#xff0c;左…

Flash 与数学:圆的切线(3)

在上面几节当中&#xff0c;已经了解过计算圆上任意一点的切线的方法&#xff0c;我们首先知道使用导数几何意义在哪里&#xff1f;在我们高中数学和大学的数学当中&#xff0c;说明了。导数的几何意义函数yf&#xff08;x&#xff09;在点x0处导数为f(x0)在几何上表示曲线yf&a…

LeetCode 1110. 删点成林(二叉树递归)

1. 题目 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的树构成的集合&#xff09;。 返回森林中的每棵树。你可以按任意顺序…

创建链表

代码#include <iostream>usingnamespacestd;structstudent //定义结构体{ intdata; student *next;};//创建链表student *CreateList(){ student *headNULL; student *pnewstudent; cin>>p->data; student *endp; while(p->data!0…

LeetCode 1286. 字母组合迭代器(回溯/位运算)

文章目录1. 题目2. 解题2.1 回溯2.2 位运算1. 题目 请你设计一个迭代器类&#xff0c;包括以下内容&#xff1a; 一个构造函数&#xff0c;输入参数包括&#xff1a;一个 有序且字符唯一 的字符串 characters&#xff08;该字符串只包含小写英文字母&#xff09;和一个数字 c…

基于Java+SpringMvc+Vue求职招聘系统详细设计实现

基于JavaSpringMvcVue求职招聘系统详细设计实现 &#x1f345; 作者主页 专业程序开发 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringMvcVue求职招聘系统详细设计实现一、前言介…

无监督学习方法总结

文章目录1. 无监督学习方法的关系和特点1.1 各种方法之间的关系1.2 无监督学习方法1.3 基础机器学习方法1. 无监督学习方法的关系和特点 八种常用的统计机器学习方法&#xff1a; 聚类方法&#xff08;层次聚类、k均值聚类&#xff09;奇异值分解&#xff08;SVD&#xff09;…

java从控制台输入数组_Java将控制台输入的一行整数转成整型数组

思路&#xff1a;将一行数据按字符串的形式读取进来。首先判断输入的字符串是不是空&#xff0c;为空的话&#xff0c;则不作任何操做。其次&#xff0c;将字符串按照指定方式切分为字符串数组&#xff0c;此处是按照空格切分&#xff0c;由于输入是按空格区分的。最后&#xf…

在Silverlight中使用Socket进行通信(1)Socket请求-回复方式的简易数据交换

很久之前用过Socket&#xff0c;由于近期项目需要用socket传输视频流&#xff0c;早上花了半小时回顾了一下。 Socket类简要介绍 socket下提供的主要类有四个&#xff0c;分别是socket,tcpclient,tcplistener,udpclient&#xff0c;他们的作用如下&#xff1a; Socket 含有大量…

java listview控件_ListView普通列表控件的使用

Android中的列表空间非常灵活&#xff0c;可以自定义每一个列表项&#xff0c;实际上每一个列表项就是一个View&#xff0c;在Android定义了3个列表控件&#xff1a;ListView、ExpandableListView和Spinner&#xff0c;其中Spinner就是在Windows中常见的下拉列表框。ListView控…

【Kaggle】Intro to Machine Learning 第一次提交 Titanic

项目官网地址 新手可以参考这篇 8、Getting Started With Titanic&#xff0c;教你如何操作、提交等 自己简要再记录一下&#xff1a; Join the competition 各个 tab 下可以查看数据Data、代码编写Notebooks、讨论、排名、比赛规则、队伍点击 Notebooks&#xff0c;新建文…