力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并)

力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并)

文章目录

      • 力扣爆刷第169天之TOP200五连刷111-115(课程表、单词搜索、归并)
      • 一、207. 课程表
      • 二、LCR 125. 图书整理 II
      • 三、402. 移掉 K 位数字
      • 四、79. 单词搜索
      • 五、912. 排序数组

一、207. 课程表

题目链接:https://leetcode.cn/problems/course-schedule/description/
思路:本题是一个典型的有向图判定是否有环,如果有环就无法完成课程,因为循环依赖。
1、那么关键点就在于该如何判定有环,我们可以把有向图想象成一个多叉树,如果单条链路上有回路,就相当于有环。
2、另外如果遍历呢?有向图的话一般是采用数组和链表构建邻接表,通过遍历邻接表就可以完成图的遍历。
3、遍历过程中需要注意哪些问题呢?要防止重复遍历,如果防止重复遍历呢?只需要维护一个boolean数组,那个节点遍历过了就给标记一下既可以。
4、如果判定有环呢?因为只要单条链路形成环路即为有环,所以只需要模拟树的遍历,在前序的位置设置标识,在后序的位置移出标识,如果在遍历的过程中,标识被重复遇到了就说明有环路。
拓展:如果存在多条可以修习完课程的路径,如何找出一条,其实只需要在后序遍历的位置,记录节点,最后翻转搜集的节点即可。
基于以上的内容,可以写出下面的代码。

class Solution {boolean[] visited;boolean[] flag;boolean finish = true;public boolean canFinish(int numCourses, int[][] prerequisites) {visited = new boolean[numCourses];flag = new boolean[numCourses];List<Integer>[] list = builderGroup(numCourses, prerequisites);for(int i = 0; i < numCourses; i++) {traverse(i, list);}return finish;}void traverse(int from, List<Integer>[] list) {if(visited[from]) {finish = false;}if(flag[from] || !finish) {return;}flag[from] = true;visited[from] = true;for(int to : list[from]) {traverse(to, list);}visited[from] = false;}List<Integer>[] builderGroup(int numCourses, int[][] prerequisites) {List<Integer>[] list = new LinkedList[numCourses];for(int i = 0; i < numCourses; i++) {list[i] = new LinkedList();}for(int[] temp : prerequisites) {list[temp[1]].add(temp[0]);}return list;}
}

二、LCR 125. 图书整理 II

题目链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/description/
思路:本题是用两个栈实现队列,思路不难。
1、实现队列只需要考虑如何先进先出就行,只需要先进栈,再出栈就可以。
2、如何防止乱序,只需要维护A,B两个栈,读取元素都从B中读,B空了就把A中元素都加入到B中,写入元素都写入到A中即可。

class CQueue {Deque<Integer> stack1 = new LinkedList<>();Deque<Integer> stack2 = new LinkedList<>();public CQueue() {}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(!stack2.isEmpty()) return stack2.pop();while(!stack1.isEmpty()) {stack2.push(stack1.pop());}if(stack2.isEmpty()) return -1;return stack2.pop();}
}/*** Your CQueue object will be instantiated and called as such:* CQueue obj = new CQueue();* obj.appendTail(value);* int param_2 = obj.deleteHead();*/

三、402. 移掉 K 位数字

题目链接:https://leetcode.cn/problems/remove-k-digits/description/
思路:本题是要求从字符串中移除掉k个数字,之后使其表示的数最小。
1、如果让剩余的数足够小?其实数字是有高位和低位的,我们应该从高位往低位进行处理。
2、具体该如何处理呢?我们只需要丢弃掉较大的数,保留较小的数即可。
3、如何丢呢?我们应该丢掉高位较大的数,保留低位较小的数,就可以实现最终的数最小。
4、具体实现可以使用单调栈,如果当前元素小于栈顶元素,则说明,高位元素值大于低位元素值,该丢弃。如果当前元素值大于栈顶元素值,说明低位元素大于高位元素,需要保留下来高位元素,因为高位元素小。

class Solution {public String removeKdigits(String num, int k) {LinkedList<Character> stack = new LinkedList<>();for(int i = 0; i < num.length(); i++) {char c = num.charAt(i);while(!stack.isEmpty() && c < stack.peek() && k > 0) {stack.poll();k--;}stack.push(c);}while(k > 0 && !stack.isEmpty()) {stack.pop();k--;}StringBuilder sb = new StringBuilder();while(!stack.isEmpty()) sb.insert(0, stack.pop());String res = "";for(int i = 0; i < sb.length(); i++) {if(sb.charAt(i) != '0') {res = sb.toString().substring(i, sb.length());break;}}return res.equals("") ? "0" : res;}
}

四、79. 单词搜索

题目链接:https://leetcode.cn/problems/word-search/description/
思路:本题求单词搜索,问能不能按照单词自己的顺序,在二维数组中找到它。这其实涉及到了几个点。
1、首先明确,这是一个典型的无向图的遍历题,DFS和BFS都可以,一般我爱用DFS,因为好写不用写栈。
2、其次,要考虑怎么进行单词搜索,可以随着递归维护一个单词读取位置的指针,只要元素相同指针就可以+1,指针只要能够走到结尾部分,就算是搜索结束,搜索到了。
3、如何防止重复遍历,直接使用一个二维boolean数组是比较浪费空间的,可以对遍历过的节点设置为’0’,递归返回时再修改回原本的值,这样就可以完美解决掉重复遍历的问题。
在这里插入图片描述

class Solution {boolean flag = false;public boolean exist(char[][] board, String word) {for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {if(flag) return true;dfs(board, word, i, j, 0);}}return flag;}void dfs(char[][] board, String word, int x, int y, int index) {if(index == word.length()) {flag = true;return;}if(x < 0 || x >= board.length || y < 0 || y >= board[0].length || flag) return;if(board[x][y] != word.charAt(index)) return;board[x][y] = '0';dfs(board, word, x-1, y, index+1);dfs(board, word, x, y-1, index+1);dfs(board, word, x+1, y, index+1);dfs(board, word, x, y+1, index+1);board[x][y] = word.charAt(index);}
}

五、912. 排序数组

题目链接:https://leetcode.cn/problems/sort-an-array/description/
思路:简单写一个排序算法就可以,不过本题的测试用例专门针对了一下快排,如果用快排的话需要自己处理,我这里用的堆排。
1、从最后一个非叶子节点开始,直到根节点,向下构造最大堆。
2、构造最大堆就是把堆顶的元素找到可以下沉到的具体位置,找到后,就把对应的元素交换位置即可。
3、构造完最大堆以后,堆顶元素就是最大值,只需要不断的把堆顶元素移动到数组尾部即可。

class Solution {public int[] sortArray(int[] nums) {heapSort(nums);return nums;}void heapSort(int[] nums) {int len = nums.length;for(int i = len/2-1; i >= 0; i--) {builderHeap(nums, i, len);}for(int i = len-1; i > 0; i--) {int max = nums[0];nums[0] = nums[i];nums[i] = max;builderHeap(nums, 0, i);}}void builderHeap(int[] nums, int start, int end) {int k = start, t = nums[start];for(int i = start*2+1; i < end; i = i*2+1) {if(i+1 < end && nums[i+1] > nums[i]) i = i+1;if(t < nums[i]) {nums[k] = nums[i];k = i;}else break;}nums[k] = t;}
}

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

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

相关文章

设计模式:详细拆解策略模式

策略模式 既然是详解&#xff0c;就不以案例开头了&#xff0c;直奔主题&#xff0c;先来看看什么是策略模式。 模式定义 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。本模式 使得算法可独立于使用它的客户而变化。 结构 Strategy&a…

C++ | Leetcode C++题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProduct(vector<string>& words) {unordered_map<int,int> map;int length words.size();for (int i 0; i < length; i) {int mask 0;string word words[i];int wordLength word.s…

深入解析Java虚拟机(JVM)内存模型-全面掌握JVM内存管理

Java虚拟机(JVM)的内存模型是Java开发者必须掌握的核心知识之一。无论你是刚入门的新手,还是经验丰富的老手,深入理解JVM内存模型都能帮助你写出更高效、更稳定的Java程序。本文将带你全面剖析JVM内存模型的各个组成部分,深入探讨其工作原理,并通过实例讲解如何进行内存优化。让…

C#-读取测序数据的ABI文件并绘制svg格式峰图

本地环境&#xff1a;win10&#xff0c;visual studio 2022 community 目录 前言问题描述实现效果解决思路实现要点ABI文件的组织方式svg绘制问题变色碱基值 动态设置svg图像宽度 前言 本文是在已有的代码基础上进行的开发&#xff0c;前期已经实现&#xff1a; ABI文件的解析…

【从零搭建SpringBoot3.x 项目脚手架】- 1. 工程初始化

为什么会有这个系列文章 在项目开发中&#xff0c;大多项目依旧沿用的是 JDK 8 Spring Boot 2.x 系列的技术栈&#xff0c;没有Spring Boot 3.x 的上手实践机会。在个人学习探索 Spring Boot 3.x 的过程中&#xff0c;遇到多数第三方框架集成和问题排查的技术问题&#xff0c…

[极客大挑战 2019]Secret File-web

打开题目 查看源码 直接访问Archive_room.php 第二个页面是个点击框&#xff0c;这里bp抓包确认&#xff1b;若是直接SECRET&#xff0c;会跳到end.php 直接访问secr3t.php 代码审计一下 playload&#xff1a;secr3t.php?fileflag.php 改为php协议读取权限 secr3t.php?f…

[图解]SysML建模电磁轨道炮-01块定义图

1 00:00:00,490 --> 00:00:04,000 我们是用EA复刻一个网络上的案例 2 00:00:06,370 --> 00:00:09,240 电磁轨道炮&#xff0c;它的原理很简单 3 00:00:09,490 --> 00:00:10,960 初中物理就可以理解 4 00:00:11,670 --> 00:00:14,010 首先&#xff0c;电流形成磁…

polyfit曲线拟合

一、简介 polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合&#xff1a;已知离散点上的数据集&#xff0c;即已知在点集上的函数值&#xff0c;构造一个解析函数&#xff08;其图形为一曲线&#xff09;使在原离散点上尽可能接…

快讯 | 苹果携手OpenAI,ChatGPT即将登陆iOS 18

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

【反序列化漏洞】serial靶机详解

一、安装靶机 首先创建新的虚拟机。 然后选择客户机版本为Ubuntu 64位。 然后选择使用现有磁盘&#xff0c;选择下载的vmdk磁盘文件即可。剩下的都是默认 二、信息收集 发现主机192.168.204.143 访问 扫描端口nmap -A 192.168.204.143 -p-&#xff0c;发现只有ssh:22和http:8…

Java:线程安全

引子 首先来看一段代码: private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{for (int i 0; i < 50000; i) {count;}});Thread t2 new Thread(()->{for (int i 0; i < 50000; i) {…

如何解决C#字典的线程安全问题

前言 我们在上位机软件开发过程中经常需要使用字典这个数据结构&#xff0c;并且经常会在多线程环境中使用字典&#xff0c;如果使用常规的Dictionary就会出现各种异常&#xff0c;本文就是详细介绍如何在多线程环境中使用字典来解决线程安全问题。 1、非线程安全举例 Dictio…

Vue+live2d实现虚拟人物互动(一次体验叙述)

目录 故事的开头&#xff1a; 最终的实现效果&#xff1a; 实现步骤&#xff1a; 第一步&#xff1a;下载重要文件 第二步&#xff1a;创建vue项目文件&#xff0c;将刚下载文件拷贝到public目录下 第三步&#xff1a;在index.html文件中引入js 第四步&#xff1a;使用&…

【数据结构算法经典题目刨析(c语言)】顺序表和链表的区别(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 顺序表和链表的区别 一、底层存储空间 二、插入和删除操作 三、随机访问 四、空间利用率 五、应用场景 六、高速缓存 为什么顺序表的缓存利用率高于链表呢…

设计界的新宠:5款热门UI在线设计软件评测

随着用户界面设计行业的蓬勃发展&#xff0c;越来越多的设计师进入用户界面设计。选择一个方便的用户界面设计工具尤为重要&#xff01;除了传统的用户界面设计工具&#xff0c;在线用户界面设计工具也受到越来越多设计师的青睐。这种不受时间、地点、计算机配置限制的工作方法…

OpenCV||超详细的图像边缘检测

一、基本概念 1.图像边缘检测目的 特征提取&#xff1a;边缘是图像中亮度变化最显著的部分&#xff0c;它们通常对应于物体的轮廓、不同区域的边界等。通过边缘检测&#xff0c;可以从图像中提取出这些重要的特征信息&#xff0c;为后续处理如图像分割、目标识别等提供基础。 …

webfunny埋点系统如何进行部署?

hello 大家webfunny埋点系统做了不少功能更新&#xff0c;平常给大家分享比较多的是**webfunny前端监控系统**&#xff0c;最近有不少技术同学来了解webfunny埋点系统&#xff0c;今天主要给大家分享下webfunny埋点系统部署&#xff0c;分为本地部署和线上部署。 还没有试用和…

字节一面面经

1.redis了解吗&#xff0c;是解决什么问题的&#xff0c;redis的应用&#xff1f; Redis 是一种基于内存的数据库&#xff0c;常用的数据结构有string、hash、list、set、zset这五种&#xff0c;对数据的读写操作都是在内存中完成。因此读写速度非常快&#xff0c;常用于缓存&…

第三期书生大模型实战营之XTuner微调个人小助手认知

基础任务 使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知&#xff0c;记录复现过程并截图。 任务结果截图 1. 创建虚拟环境 # 安装一些必要的库 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y # 安…

2024华数杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;A<B<C。 综合评价来看 A题适合对机械臂和机器人运动学感兴趣的同学&#xff0c;尤其是有一定编程和优化算法基础的同学。不建议非相关专业同学选择。 B题挑战较大&#xff0…