力扣爆刷第174天之TOP200五连刷136=140(最小k数、字典序、跳跃游戏)

news2024/12/23 7:13:24

力扣爆刷第174天之TOP200五连刷136=140(最小k数、字典序、跳跃游戏)

文章目录

      • 力扣爆刷第174天之TOP200五连刷136=140(最小k数、字典序、跳跃游戏)
      • 一、LCR 159. 库存管理 III
      • 二、450. 删除二叉搜索树中的节点
      • 三、440. 字典序的第K小数字
      • 四、LCR 127. 跳跃训练
      • 五、45. 跳跃游戏 II

一、LCR 159. 库存管理 III

题目链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/description/
思路:本题让求数组中最小的前k个数,这类题目是比较常见的,一般的有求最大的k个数,最小的k个数,做法还是比较多的。
1、总体思想是需要排序,哪一种都可以,但是要兼顾时间复杂度、空间复杂度。
2、一般的做法要么是使用堆排序,要么是使用快排。
3、如果是堆排,就是维护大顶堆或者小顶堆;如果是快排,可以利用快排的特性。
4、下面的解法就是利用快排,快排的特性就是每次都把一个元素移动到最终的位置上去,且让该元素左边的都小于它,右边的都大于它。
5、那么我们就可以不全部排序,只需要不断的用快排划分区间,一旦划分到了k,就可以返回了,因为划分到了k以后,k左边的都小于它,右边的都大于它。

class Solution {
    public int[] inventoryManagement(int[] stock, int cnt) {
        if(cnt == stock.length) return stock;
        quickSort(stock, 0, stock.length-1, cnt);
        return Arrays.copyOf(stock, cnt);
    }

    void quickSort(int[] stock, int left, int right, int cnt) {
        if(left >= right) return;
        int mid = stock[left], i = left, j = right;
        while(i < j) {
            while(i < j && stock[j] >= mid) j--;
            while(i < j && stock[i] <= mid) i++;
            swap(stock, i, j);
        }
        swap(stock, left, i);
        if(i + 1 > cnt) quickSort(stock, left, i-1, cnt);
        if(i + 1 < cnt) quickSort(stock, i+1, right, cnt);
    }

    void swap(int[] stock, int left, int right) {
        int t = stock[left];
        stock[left] = stock[right];
        stock[right] = t;
    }
}

二、450. 删除二叉搜索树中的节点

题目链接:https://leetcode.cn/problems/delete-node-in-a-bst/description/
思路:本题让删除二叉搜索树中的指定元素值的节点,其实思路很简答。
1、首先明确应该分为两个步骤,第一个是找到找到对应的节点,第二个是删除对应的节点并且维持二叉搜索树的特性。
2、首先考虑遍历方式,需要利用二叉搜索树的特性从上往下搜索,处理完以后需要递归返回节点,所以采用后序遍历的遍历方式。
3、搜索到以后该如何删除?可以分为几种情况进行讨论:
3.1、如果本身就是叶子节点,那么可以直接返回null,把该节点删除。
3.2、如果该节点的左子树或者右子树为null,也可以直接返回不空的子树。
3.3、只有左右子树都不为null的情况下,需要考虑维护二叉搜索树的特性,可以找到该节点左子树中最大的节点,然后把右子树给拼接过去,或者找到该节点右子树中最小的节点,然后把左子树给拼接过去。


class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return root;
        if(key < root.val) {
            root.left = deleteNode(root.left, key);
        }else if(key > root.val) {
            root.right = deleteNode(root.right, key);
        }else{
            if(root.left == null && root.right == null) return null;
            if(root.left == null) return root.right;
            if(root.right == null) return root.left;
            TreeNode temp = root.left;
            while(temp.right != null) temp = temp.right;
            temp.right = root.right;
            return root.left;
        }
        return root;
    }
}

三、440. 字典序的第K小数字

题目链接:https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/description/
思路:本题让求字典序的第K小数字,所谓字典序,也就是如有1-10共10个数,字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]。
画出来如下图所示,那么让寻找第K小的数字,其实对于下面的数结构来说,也就是通过前序遍历的方式就可以找到第K小的数字。
1、如何遍历?其实对于这个问题,因为我们要求是第K小的数字,可以把问题转变为统计以某个节点为前缀,判断该前缀下节点的数量。
2、通过节点的数量与K的大小判断是继续横向遍历还是纵向遍历。
3、如果总数N为21,k为15,以1为前缀下的节点数量只有11个,即1,和10-19.这个数是小于k的,所以要横向遍历,计算前缀为2下面的节点数量。2下面只有20,21.加和一共13个数,是小于15的,所以继续横向拓展。
在这里插入图片描述

class Solution {
    public int findKthNumber(int n, int k) {
        long root = 1;
        k--;
        while(k > 0) {
            int count = countNum(n, root);
            if(count <= k) {
                root++;
                k -= count;
            }else{
                k--;
                root *= 10;
            }
        }
        return (int)root;
    }


    int countNum(int n, long root) {
        long total = 0;
        long next = root + 1;
        while(root <= n) {
            total += Math.min(n+1, next) - root;
            root *= 10;
            next *= 10;
        }
        return (int) total;
    }
}

四、LCR 127. 跳跃训练

题目链接:https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/description/
思路:本题求跳跃种数,也就是每次只能跳一步或者两步,其实就是斐波那契数列,这么说就好求了,不要使用递归,递归会有大量的重复计算,可以采用动态规划,用dp数组记录下前两个所依赖的位置,即可。

class Solution {
    public int trainWays(int num) {
        long a = 1, b = 1, c = 1;
        for(int i = 2; i <= num; i++) {
            c = a + b;
            c = c % 1000000007;
            a = b;
            b = c;
        }
        return (int)c;
    }
}

五、45. 跳跃游戏 II

题目链接:https://leetcode.cn/problems/jump-game-ii/description/
思路:给定一个数组,数组中的每一个数表示可以可以往前跳跃的距离,问从Nums[0]开始跳,跳越到尾部所需的最小次数。
1、其实很简答,只需要从Nums[0]开始,维护一个右边界,然后在遍历抵达右边界的过程中,记录最远可以跳跃到的距离。
2、当抵达到了右边界,就把跳跃次数加1,把右边界设置为在此过程中记录的最远距离。
3、以此往复就可以。

class Solution {
    public int jump(int[] nums) {
        int end = 0, max = 0, count = 0;
        for(int i = 0; i < nums.length; i++) {
            if(end >= nums.length-1) return count;
            max = Math.max(max, i + nums[i]);
            if(end == i) {
                end = max;
                count++;
            }
        }
        return count;
    }
}

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

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

相关文章

【C语言】进程和线程详解

目录 C语言进程和线程详解1. 进程和线程的对比2. 进程的基本概念2.1 进程的定义2.2 进程的特点2.3 进程的生命周期 3. 进程管理3.1 进程创建3.2 进程间通信&#xff08;IPC&#xff09;3.2.1 管道&#xff08;Pipe&#xff09; 4. 线程的基本概念4.1 线程的定义4.2 线程的特点 …

Halcon灰度图像的形态学运算

Halcon灰度图像的形态学运算 本文介绍的算子的输入类型是灰度的Image图像。 1. 灰度图像与区域的区别 基于区域的形态学运算与基于灰度图像的形态学运算的根本区别在于&#xff0c;二者输入的对象不同。前者输入的是一些区域&#xff0c;并且这些区域是经过闽值处理的二值图…

微信小程序在线客服源码系统全端通吃 带完整的安装代码包以及搭建部署教程

系统概述 “微信小程序在线客服源码系统全端通吃”是一款集智能客服、人工客服、消息管理、数据分析等功能于一体的综合性解决方案。该系统基于微信小程序平台开发&#xff0c;支持全端接入&#xff08;包括Web、App、小程序等&#xff09;&#xff0c;实现多渠道客户服务的无…

英国海外媒体通稿宣发:顶级媒体宣发

1.伦敦日报londonjournal 作为英国首都的权威日报&#xff0c;伦敦日报一直是英国新闻界的佼佼者。它详尽报道伦敦及英国各地的政治、经济、社会、文化、体育等各方面的新闻&#xff0c;深受读者喜爱。 2.英国先驱报ukherald 英国先驱报是一份全国性日报&#xff0c;以深度分…

源码构建LAMP

目录 一、安装Apache 二、安装Mysql 三、安装PHP 四、安装论坛 一、安装Apache 1.cd 到opt目录下面&#xff0c;将压缩包拉进Xhell 2.解压缩apr和httpd压缩包 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf httpd-2.4.29.tar.bz2 3.将apr-1.6.2 移动到ht…

playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始&#xff0c;表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于…

开放式耳机原理是什么?它通过不入耳的方式带来动感音乐

开放式耳机的原理主要分为两种类型&#xff1a;气传导和骨传导。 气传导耳机&#xff1a;这种耳机的工作原理依赖于空气作为声音传播的介质。具体来说&#xff0c;音频设备通过耳机线将电信号传递到耳机&#xff0c;耳机内部的驱动单元&#xff08;通常是动圈式或平衡电枢式&am…

未开启语音助手时,远程控制功能助你快速在家找回手机!

完成一整天的大扫除之后&#xff0c;顺手就想摸出手机刷一下短视频&#xff0c;但摸不到。干了一天活&#xff0c;手机放哪里都忘了&#xff0c;于是不得不在几个房间之间寻找。 但找过手机的都知道&#xff0c;越找越是找不到。糟糕的是前几天我嫌麻烦&#xff0c;把语音助手…

<数据集>铝型材缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1885张 标注数量(xml文件个数)&#xff1a;1885 标注数量(txt文件个数)&#xff1a;1885 标注类别数&#xff1a;10 标注类别名称&#xff1a;[budaodian, tufen, loudi, qikeng, pengshang, tucengkailie, zangdi…

光伏模拟器的应用

太阳能光伏 (PV) 模拟器是一种可编程电源&#xff0c;用于模拟太阳能电池板。模拟器具有快速瞬态响应&#xff0c;可响应负载条件的变化并保持电压-电流特性的输出。 用户可以根据系统规格定义太阳能电池板配置&#xff0c;并通过选择环境条件来选择适当的环境条件进行模拟。用…

通风采光排烟天窗现行七本图集概览

在建筑设计与施工中&#xff0c;通风采光排烟天窗作为优化室内环境的重要设备&#xff0c;选择合适的型号及合理应用至关重要。当前市场上存在着多本标准化、规范化的通风采光排烟天窗图集&#xff0c;为设计师、工程师及施工单位、通风采光排烟天窗生产厂家提供丰富的参考资源…

如何有效找到目标客户群体?

在激烈的市场竞争中&#xff0c;找到并锁定目标客户群体是企业成功的关键。以下是几种有效的策略&#xff0c;帮助您精准定位并吸引目标客户。 1. 明确市场定位与客户画像 首先&#xff0c;企业需要明确市场定位&#xff0c;并绘制详细的客户画像&#xff0c;包括年龄、性别、…

LeetCode合并两个有序链表

题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2…

以FLV解复用为例详解开源库FFmpeg中解复用器的源码逻辑及处理流程

目录 1、FFmpeg简介 2、FLV文件格式介绍 3、注册解复用器 4、解复用器的处理 4.1、AVFormatContext 4.1.1、AVClass 4.1.2、AVOption 4.1.3 AVDictionary—AV字典 4.1.4、AVIOContext 4.1.4.1、URLProtocol 4.1.4.2、AVIOContext的初始化及获取 4.1.5、AVInputF…

基于vue篮球联盟管理系统pf

TOC springboot476基于vue篮球联盟管理系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…

Python入门教程(超详细)

《网络安全自学教程》 Python是一种「基于C语言」实现的&#xff0c;「开源」的&#xff0c;「面向对象的」的&#xff0c;「动态数据类型」的「解释型」语言。 Python的语法「简单」且「优雅」&#xff0c;相对于其他语言学习「难度较低」&#xff0c;入门非常快。 Python的…

【C++】使用红黑树封装map与set

文章目录 1. 源码分析2. 调整红黑树的结构搭建map、set3. 红黑树的迭代器3.1 普通迭代器3.2 const迭代器3.3 map的operator[ ] 4. 完整代码4.1 RBTree4.2 MyMap4.3 MySet 对于map与set&#xff0c;它们一个是KV模型&#xff0c;一个是K模型&#xff0c;那我们要写两个红黑树吗&…

基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf

TOC springboot504基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和…

解决springboot中Aspect注解不生效问题

如下图所示&#xff0c;配置了一个注解类型的Aspect&#xff0c;结果一直不生效 运行结果可以看到&#xff0c;其他非注解类型的Aspect都顺利执行了&#xff0c;但是这个注解的切面就是没有执行 当时也在网上搜了半天&#xff0c;包括在启动类增加配置&#xff0c;接口都要加上…

Java语言程序设计基础篇_编程练习题**16.30(模式识别:连续四个相同的数)

目录 题目&#xff1a;**16.30&#xff08;模式识别&#xff1a;连续四个相同的数&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;**16.30&#xff08;模式识别&#xff1a;连续四个相同的数&#xff09; 为编程练习题8.19编写一个GUI程序。让用户在6行7列的网格的…