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

news2024/9/26 1:22:39

力扣爆刷第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.coloradmin.cn/o/1975629.html

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

相关文章

Python自动化办公2.0:重塑工作效率的未来

在现代办公环境中&#xff0c;自动化技术和数据分析已经成为提升工作效率和决策质量的关键。随着Python编程语言的发展&#xff0c;我们迎来了“Python自动化办公2.0”时代&#xff0c;这一时代不仅包括强大的数据分析工具&#xff0c;还涵盖了酷炫的可视化技术和前沿的机器学习…

【卷积神经网络】卷积层详解【数学+python代码】

1、简介 学习目标&#xff1a; 掌握卷积计算过程掌握特征图大小计算方法掌握PyTorch卷积层API 基本概念&#xff1a; ①在计算机视觉领域&#xff0c;往往我们输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高。 另外图像也很 难保留原有的特征 &am…

科技赋能生活——便携气象站

传统气象站往往庞大而复杂&#xff0c;需要专业人员维护&#xff0c;它小巧玲珑&#xff0c;设计精致&#xff0c;可以轻松放入背包或口袋&#xff0c;随身携带&#xff0c;不占空间。无论是城市白领穿梭于高楼大厦间&#xff0c;还是户外爱好者深入山林湖海&#xff0c;都能随…

numpy如何按等长分割数组

numpy如何按等长分割数组 1、效果 2、流程 1、分割数组 2、转列表3、代码 # -*- coding: utf-8 -*-""" @contact: 微---信 1257309054 @file: test.py @time: 2024/8/03 19:46 @author: LDC """ import numpy as np# 假设arr是需要分割的nump…

virtualbox7安装centos7.9配置静态ip

1.背景 我大概在一年之前安装virtualbox7centos7.9的环境&#xff0c;但看视频说用vagrant启动的窗口可以不用第三方工具(比如xshell、secure等)连接centos7.9&#xff0c;于是尝鲜试了下还可以&#xff0c;导致系统文件格式是vmdk了&#xff08;网上有vmdk转vdi的方法&#xf…

ChatGLM3-6B模型部署微调实战

准备 教程 视频教程 https://www.bilibili.com/video/BV1ce411J7nZ?p14&vd_source165c419c549bc8d0c2d71be2d7b93ccc 视频对应的资料 https://pan.baidu.com/wap/init?surlAjPi7naUMcI3OGG9lDpnpQ&pwdvai2#/home/%2FB%E7%AB%99%E5%85%AC%E5%BC%80%E8%AF%BE%E3%8…

Keil5.40因为Jlink驱动闪退问题

现象 Cannot load driver ‘C:\Keil_v5\ARM\Segger\JL2CM3.dll 原因 由于Jlink为盗版&#xff0c;导致闪退。 具体为JLinkARM.dll这个插件搞鬼。 这个插件的来源为 也就是我们装Jlink驱动的时候&#xff0c;勾选了这个选项&#xff0c;而导致这个毒瘤插件进入Keil&#xff…

代码题-01_顺序表_基础知识

线性表 线性表&#xff08;list&#xff09;:零个或多个相同数据元素的有限序列 线性表是逻辑结构&#xff08;元素之间一对一相邻关系&#xff09;按存储方式分为 顺序表链表 顺序表 顺序表的定义 静态分配&#xff08;使用数组存数据&#xff09; 有溢出风险 typedef…

特定领域软件架构-系统架构师(三十七)

软件架构复用 有三个阶段&#xff1a; 首先构造/获取可复用的软件资产其次管理这些资产&#xff08;构件库&#xff09;最后针对这些需求&#xff0c;从这些资产中选择可复用的部分&#xff0c;满足需求应用系统。 特定领域软件架构 DSSA&#xff08;Domain Specific softwa…

(四)activit5.23.0修复跟踪高亮显示BUG

一、先看bug 在 &#xff08;三&#xff09;springboot2.7.6集成activit5.23.0之流程跟踪高亮显示 末尾就发现高亮显示与预期不一样&#xff0c;比如上面的任务2前面的箭头没有高亮显示。 二、分析原因 具体分析步骤省略了&#xff0c;主要是ProcessInstanceHighlightsResour…

饿了么冰杯外卖爆涨350%,“冰+X”激发酒饮即时零售夏季增长加速

近日&#xff0c;饿了么联合尼尔森IQ共同发布的《2024夏季即时零售冰品酒饮消费洞察报告》显示&#xff0c;大暑前后冰杯外卖量同比去年增长350%&#xff0c;冰杯搭配啤酒等酒水饮料的外卖量也同比增长约300%。 报告综合多渠道零售数据和案例分析&#xff0c;剖析了冰品酒饮在…

基于51单片机的车窗控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1w5qrAvn1cUK7ZX2GJvWBQw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

DedeCMS-V5.7.82-UTF8织梦

先进行安装 然后进入首页和管理员后台 内容要在后台进行操作 首页 后台 1.通过文件管理器上传WebShell 访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过文件管理器上传php文件获取webshel 登陆到后台点击【核心】【文件式管理器】【文件上传】将…

基于深度学习的面部表情分类识别系统

&#xff1a;温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 面部表情识别是计算机视觉领域的一个重要研究方向&#xff0c; 它在人机交互、心理健康评估、安全监控等领域具有广泛的应用。近年来&#xff0c;随着深度学习技术的快速发展&#xf…

C++篇:入门(2)

引用 引用的概念以及定义&#xff1a; 在C中&#xff0c;引用&#xff08;Reference&#xff09;是一个非常重要的概念又可以称之为取别名&#xff0c;它允许我们创建一个已存在对象的别名。引用提供了一种机制&#xff0c;通过它可以直接访问另一个变量、对象或函数的值&#…

Nginx进阶-常见配置(一)

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…

【实现100个unity特效之12】Unity中的冲击波 ——如何使用ShaderGraph制作一个冲击波着色器

最终效果 文章目录 最终效果新增LitShaderGraph圆环扭曲效果优化冲击波效果屏幕全屏冲击波圆形冲击波最终连线图代码控制补充源码完结 新增LitShaderGraph 圆环扭曲效果 让我们从一个UV节点开始 创建一个Vector2变量RingSpawnPosition表示冲击波生成位置,在X和Y上将其默认值…

springboot实现前后端调用axios异步请求(后端单体服务器static部分)

目的&#xff1a;让页面调用controller&#xff0c;将数据加载到页面中&#xff08;只不过这个前端页面我们直接就是放到了static里面了&#xff09;。 第一步&#xff1a;导入文件 所需要的文件见本文最后“文件获取”&#xff1a; &#xff08;1&#xff09;文件如下&…

汇昌联信拼多多运营怎么样?

汇昌联信拼多多运营怎么样?在探讨汇昌联信在拼多多平台的运营情况时&#xff0c;首先需要明确的回答是&#xff1a;汇昌联信在拼多多的运营表现是积极的&#xff0c;并取得了一定的成效。接下来&#xff0c;我们将从五个不同的角度深入分析其运营策略及效果。 一、产品多样性与…

Centos7挂载数据盘

查看当前服务器有哪些磁盘 fdisk -l 2.格式化 mke2fs -t ext4 /dev/vdc 3.挂载数据盘 mkdir /sdxinfang mount /dev/vdc /sdxinfang/ 为了避免每次开机都要重新挂载&#xff0c;直接设置系统挂载信息&#xff0c;这样开机会自动挂载 vim /etc/fstab 在文件末尾增加以下内容&…