LeetCode第187场周赛

本次周赛跟前几次周赛对比一下还是有一点进步的,AC了两道题,第三题第一次做TLE了,然后之后想到用滑动窗口,但奈何程序不会写。最后一道题连题目都看不懂(自己真的太菜了)。
在这里总结一下经验以及分享自己AC前两道题的思路。

一、5400. 旅行终点站
链接:https://leetcode-cn.com/problems/destination-city/.

给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。
题目数据保证线路图会形成一条不存在循环的线路,因此只会有一个旅行终点站。

刚看到这道题说实话是有一点懵的,不过仔细一想这道题还是比较简单的。我们只需要找出出现在终点而并未出现在起点的位置即可。

public String destCity(List<List<String>> paths) {List<String> list = new ArrayList<String>();for(int i = 0; i < paths.size(); i++){list.add(paths.get(i).get(1));}for(int i = 0; i < paths.size(); i++){String s = paths.get(i).get(0);if(list.contains(s)) list.remove(s);}return list.get(0);}

二、5401. 是否所有 1 都至少相隔 k 个元素
链接:https://leetcode-cn.com/problems/check-if-all-1s-are-at-least-length-k-places-away/.
给你一个由若干 0 和 1 组成的数组 nums 以及整数 k。如果所有 1 都至少相隔 k 个元素,则返回 True ;否则,返回 False 。

这道题采用了比较暴力的算法,直接找1的位置,将他们进行相减即可。

//静态数组
public boolean kLengthApart(int[] nums, int k) {int n = nums.length;int[] res = new int[n];int index = 0;for(int i = 0; i < n; i++){if(nums[i] == 1) res[index ++] = i;}for(int i = 0; i < index - 1; i++){//此处需要再-1是因为求得是两个数之间的距离if(res[i + 1] - res[i] - 1 < k) return false;}return true;}

当然这道题也可以使用双指针的思路:

//双指针
public boolean kLengthApart(int[] nums, int k) {//pre = -10000是参照leetcode上的题解for(int pre = -10000, next = 0; next < nums.length; next ++){if(nums[next] == 1){if(next - pre <= k) return false;else pre = next;}}return true;}

三、5402. 绝对差不超过限制的最长连续子数组
链接:https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/.

这道题我的思路是采用暴力的方式,直接求解(当然这个是会超时的),以下附上我所写的暴力的算法。

//暴力解法
public int longestSubarray(int[] nums, int limit) {if(nums.length == 1){return 1;}int maxLength = 0;for(int i = 0; i < nums.length - 1; i++){int max = nums[i], min = nums[i];int j = i + 1;while(j < nums.length){max = Math.max(max, nums[j]);min = Math.min(min, nums[j]);if(Math.abs(max - min) <= limit){maxLength = Math.max(maxLength, j - i + 1);}j ++;}    }return maxLength;}

之后对暴力解法进行优化:
这道题自己看了大佬写的代码,看不懂,所以看了花花酱的视频,花花酱一共讲了滑动窗口的思路,用到了两种写程序的方式(下文会一一列举出来)。
思路详解:我们首先需要一个窗口,然后将数组中的元素添加进去,如果添加的元素满足limit的条件,那我们继续往下进行,如果不满足,我们需要删除左边的第一个元素(至于为什么删除左边第一个元素,可以详细看一看labuladong公众号上关于滑动窗口详解)。

第一种程序方式:使用的是c++中的multiset算法

public:int longestSubarray(vector<int>& nums, int limit) {multiset<int> s;int l = 0, res = 0;for(int r = 0; r < nums.size(); r++){s.insert(nums[r]);//判断最大值-最小值是否满足条件while(*rbegin(s) - *begin(s) > limit){//不满足,则去除掉左边元素s.erase (s.equal_range (nums[l++]).first);}res = fmax(res,r - l + 1);}return res;}

第二种方式采取了双队列的方式,一个队列用来存储最大值,另一个队列用来存储最小值。

public int longestSubarray(int[] nums, int limit) {int n = nums.length;int l = 0, ans = 0;Deque<Integer> max = new ArrayDeque<>();Deque<Integer> min = new ArrayDeque<>();for(int r = 0; r < n; r++){while(!max.isEmpty() && nums[r] > max.peekLast()){max.pollLast();}max.addLast(nums[r]);while(!min.isEmpty() && nums[r] < min.peekLast()){min.pollLast();}min.addLast(nums[r]);while(max.peekFirst() - min.peekFirst() > limit){if(max.peekFirst() == nums[l]) max.pollFirst();if(min.peekFirst() == nums[l]) min.pollFirst();l++;}ans = Math.max(ans, r - l + 1);}return ans;}

如果有不明白的地方,可以在b站看一看花花酱的视频。
视频链接:https://www.bilibili.com/video/BV1Cf4y1m7aN?from=search&seid=573184578394241963.

四、1439. 有序矩阵中的第 k 个最小数组和
等我学会了再补充…

LeetCode周赛相关推荐

  1. C/C++描述 LeetCode 周赛 第199场周赛(阿里云专场)

    C/C++描述 LeetCode 周赛 第199场周赛(阿里云专场)   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN ...

  2. [LeetCode周赛复盘] 第 314 场周赛20221009

    [LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...

  3. leetcode周赛5465. 子树中标签相同的节点数

    leetcode周赛5465. 子树中标签相同的节点数 给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰好有 n - 1 条 edges .树的根节 ...

  4. 我也是LeetCode周赛“三道题选手”啦 第270场周赛

    第270场周赛小结 我的Weekly Contest 270战况 什么是LeetCode周赛? show my code! 复盘解决Hard题 我的Weekly Contest 270战况 参加周赛有 ...

  5. [LeetCode周赛复盘] 第 89 场双周赛20221015

    [LeetCode周赛复盘] 第 89 场双周赛20221015 一.本周周赛总结 二. [Easy] 6208. 有效时间的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medium] ...

  6. [LeetCode周赛复盘] 第 324 场周赛20221218

    [LeetCode周赛复盘] 第 324 场周赛20221218 一.本周周赛总结 二. [Easy] 6265. 统计相似字符串对的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Med ...

  7. [LeetCode周赛复盘] 第 310 场周赛20220911

    [LeetCode周赛复盘] 第 310 场周赛20220911 一.本周周赛总结 二. [Easy] 6176. 出现最频繁的偶数元素 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medi ...

  8. 宝宝也能看懂的 leetcode 周赛 - 174 - 3

    1339. 分裂二叉树的最大乘积 Hi 大家好,我是张小猪.欢迎来到『宝宝也能看懂』系列之 leetcode 周赛题解. 这里是第 174 期的第 3 题,也是题目列表中的第 1339 题 -- 『分 ...

  9. 第一次LeetCode周赛心得(力扣-cn周赛,使用python3)

    第一次力扣参赛:第 174 场力扣周赛 第 174 场力扣周赛赛题: https://leetcode-cn.com/circle/discuss/lEfEkb/view/OrAJAh/ 第 174 ...

  10. leetcode周赛,希望咸鱼,有一天可以薅到羊毛

    进阶指南每日一题地址 atcoder训练地址 leetcode max ratings:2100 碎碎念念 22/4/16 LCP春季杯 LCP 54. 夺回据点 少了个特判...qwq 22/3/6 ...

最新文章

  1. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接
  2. Tomcat 处理 HTTP 请求源码分析(下)【转】
  3. PHP导入Excel和导出Excel
  4. [Apple开发者帐户帮助]三、创建证书(3)创建企业分发证书
  5. sap-ui-core.js reference in Webclient ui
  6. 电信aep平台是什么意思_江苏天鼎证券:股票平台跳水是什么意思?股票为什么会跳水?...
  7. 【包邮送书活动】20210924期-开奖通知
  8. Wi-Fi 6到底有什么特别?
  9. Dubbo Zookeeper Quick Start
  10. python 调用外部程序 终端异常_python调用外部命令
  11. 深度学习自学(二十):SmoothL1 和 Softmax交叉熵
  12. 计算机组成原理实验报告 实验五 三人表决电路实验
  13. centeros 下载及安装
  14. awg线规,直径,面积,电流对照
  15. autojs通用拾色器
  16. 文本框里面加删除按钮
  17. 7、C语言回调函数使用
  18. android studio 把libs包打包到apk中,设置应用以32bit去读取.so文件
  19. 为什么linux虚拟机文件78g,linux 磁盘空间被占满但找不到目标文件的问题处理 lsof命令...
  20. 去除数字的正则表达式

热门文章

  1. Linux环境运行jmeter+测试报告查看
  2. spss可以关键词词频分析吗_词频分析及常用工具比较研究.pdf
  3. 武汉市电子信息职业技术学校现代电子电工高水平实训基地
  4. 计算机绘图cad期末考试试题,工程制图考试
  5. 默认选中select 第一个option
  6. Tomcat 修改端口号
  7. 病毒分析四:steam盗号病毒
  8. C++信息学奥赛一本通_1020
  9. 车型代号对照表_车型代号对照表_相关文章专题_写写帮文库
  10. 8uftp,8uftp绿色版软件有哪些功能