LeetCode高频算法刷题记录5

news2024/9/29 7:18:11

文章目录

  • 1. 最长递增子序列【中等】
    • 1.1 题目描述
    • 1.2 解题思路
    • 1.3 代码实现
  • 2. 接雨水【困难】
    • 2.1 题目描述
    • 2.2 解题思路
    • 2.3 代码实现
  • 3. 二叉树中的最大路径和【困难】
    • 3.1 题目描述
    • 3.2 解题思路
    • 3.3 代码实现
  • 4. 二叉树的中序遍历【简单】
    • 4.1 题目描述
    • 4.2 解题思路
    • 4.3 代码实现
  • 5. 删除链表的倒数第 N 个结点【中等】
    • 5.1 题目描述
    • 5.2 解题思路
    • 5.3 代码实现

1. 最长递增子序列【中等】

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/
参考题解:https://leetcode.cn/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/

1.1 题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -10^4 <= nums[i] <= 10^4

进阶:

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

1.2 解题思路

对于以数组某个位置 i 结束的最长递增子序列,一定是以前面各个位置结束的最长递增子序列加上 1 ,也就是加上当前位置,并且前面位置上的值要比当前位置 i 上的值要小。所以可以用双重循环实现,第一重循环遍历所有位置,找到以各个位置结束的最长递增子序列;第二重循环遍历在当前位置之前且比当前位置的值要小的位置,看以哪个位置结束的最长递增子序列加上 1 最大。用一个全局变量记录遍历过程中遇到的最大值,即为答案。

1.3 代码实现

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int len = nums.size();
        vector<int> currentMaxLen(len, 1);
        int ans = 1;
        for(int i = 0; i < len; ++i) {
            for(int j = 0; j < i; ++j) {
                if(nums[j] < nums[i]) {
                    currentMaxLen[i] = max(currentMaxLen[i], currentMaxLen[j] + 1);
                    ans = max(ans, currentMaxLen[i]);
                }
            }
        }
        return ans;
    }
};

2. 接雨水【困难】

题目链接:https://leetcode.cn/problems/trapping-rain-water/
参考题解:https://leetcode.cn/problems/trapping-rain-water/solution/jie-yu-shui-by-leetcode-solution-tuvc/

2.1 题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

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

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 10^4
  • 0 <= height[i] <= 10^5

2.2 解题思路

某个位置能够接到的雨水量,等于其左右两侧最高位置中的较小值减去该位置的高度。因此可以先扫描两遍,找到每个位置左右两侧的最高位置是多少,然后再扫描一次,计算各个位置能接的雨水量。一共是三次遍历循环。每个位置左/右两侧的最高位置是在其左/右相邻的前一个最高状态和自身高度之间选较大者,同时要注意边界条件的处理。

2.3 代码实现

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        vector<int> leftHighest(len, 0);
        vector<int> rightHighest(len, 0);
        leftHighest[0] = height[0];
        rightHighest[len - 1] = height[len - 1];
        for(int i = 1; i < len; ++i) {
            leftHighest[i] = max(leftHighest[i - 1], height[i]);
        }
        for(int i = len - 2; i >= 0; --i) {
            rightHighest[i] = max(rightHighest[i + 1], height[i]);
        }
        int ans = 0;
        for(int i = 0; i < len; ++i) {
            ans += min(leftHighest[i], rightHighest[i]) - height[i];
        }
        return ans;
    }
};

3. 二叉树中的最大路径和【困难】

题目链接:https://leetcode.cn/problems/binary-tree-maximum-path-sum/
参考题解:https://leetcode.cn/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/

3.1 题目描述

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

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

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

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

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是 [1, 3 * 10^4]
  • -1000 <= Node.val <= 1000

3.2 解题思路

每一条路径其实都可以看做是一个根节点加上左右两条子路径组成的。因此可以对每个节点求其左右最长的子路径,也可以理解成以该节点出发,往左边或者右边最长的路径。注意,由于节点存在负值,因此左右最长的子路径可能为0。要求的整个树的最长路径,就是在遍历各个节点过程中遇到的最大的 节点值 + 左最长的子路径值 + 右最长的子路径值。而在求各个节点最长的子路径时,可以递归实现,分别递归求左子树和右子树里最长的子路径,然后取二者中的较大值。

3.3 代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxSubPathSum(TreeNode* root, int &ans) {
        if(!root)
            return 0;
        int leftMax = max(maxSubPathSum(root->left, ans), 0);
        int rightMax = max(maxSubPathSum(root->right, ans), 0);
        ans = max(ans, root->val + leftMax + rightMax);
        return max(leftMax, rightMax) + root->val;
    }
    int maxPathSum(TreeNode* root) {
        int ans = root->val;
        maxSubPathSum(root, ans);
        return ans;
    }
};

4. 二叉树的中序遍历【简单】

题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/
参考题解:https://leetcode.cn/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/

4.1 题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

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

输入:root = [1,null,2,3]
输出:[1,3,2]

示例2:

输入:root = []
输出:[]

示例3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

4.2 解题思路

用“左根右”的顺序递归实现。

4.3 代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void inorder(TreeNode* root, vector<int>& ans) {
        if(!root)
            return;
        inorder(root->left, ans);
        ans.push_back(root->val);
        inorder(root->right, ans);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        inorder(root, ans);
        return ans;
    }
};

5. 删除链表的倒数第 N 个结点【中等】

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
参考题解:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/solution/shan-chu-lian-biao-de-dao-shu-di-nge-jie-dian-b-61/

5.1 题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

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

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例2:

输入:head = [1], n = 1
输出:[]

示例3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶: 你能尝试使用一趟扫描实现吗?

5.2 解题思路

用两个指针,一个先顺着链表往后移动 n 下,然后两个指针再同时往后移。如果两个指针开始时都指向头结点,那么后移动的指针最终指向的就是要删除的节点。实际上可以让后移动的节点先指向一个辅助头节点,这样一来该指针最终指向的就是要删除的节点的前一个节点,可以直接完成删除。

5.3 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* right = head;
        ListNode* dummy = new ListNode(0, head);
        ListNode* left = dummy;
        for(int i = 0; i < n; ++i)
            right = right->next;
        while(right) {
            right = right->next;
            left = left->next;
        }
        left->next = left->next->next;
        return dummy->next;
    }
};

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

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

相关文章

HTB靶机014-Sunday-WP

Sunday 靶机IP&#xff1a;10.10.10.76 PortScan Nmap 快速扫描&#xff1a; ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 -F 10.10.10.76 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-06 00:10 CST Nmap scan report for 10.10.10.76 Host is …

2023年广东省中职网络安全Web渗透测试解析(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问地址http://靶机IP/task1,分析页面内容,获取flag值,Flag格式为flag{xxx}; 2.访问地址http://靶机IP/task2,访问登录页面。用户user01的密码为1-1000以内的数,获取用户user01的密码,将密码作为Flag进行提交,Flag格式…

客户端读取响应头+后端读取请求头的那些事

在一些特殊场景中&#xff0c;我们在客户端想要去获取服务端接口设置的一些自定义响应头&#xff0c;服务端该如何处理&#xff0c;客户端才能取到这些自定义响应头的值呢&#xff1f; 特殊场景&#xff0c;我这里也举例一下&#xff0c;原生页面webView嵌入web页面。这个时候…

Shell脚本编程入门--Day2

文章目录 几个简单内置shell命令shell字串的语法计算变量长度的各种玩法批量修改文件名特殊shell扩展变量实际应用父子shell创建进程列表&#xff08;创建子shell&#xff09; 几个简单内置shell命令 echo -n 不换行输出 -e 解析字符串中的特殊符号 &#xff08;\n, \r, \t, \…

浏览器的进程和线程

浏览器是多进程多线程的应用程序 浏览器进程 主要负责界面显示、用户交互、子进程管理等。浏览器进程内部会启动多个线程处理不同的任务。 网络进程 负责加载网络资源。网络进程内部会启动多个线程来处理不同的网络任务。 渲染进程 渲染进程启动后&#xff0c;会开启一个染主线…

macOS 13.4正式版(22F66)With OpenCore 0.9.2开发版 and winPE双引导分区原版镜像

镜像特点 原文地址&#xff1a;http://www.imacosx.cn/113625.html 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直…

java boot项目基础配置之设置启动端口

因为 springboot 项目是一个内嵌的tomcat 那么 我们就来研究一下 怎么改它的启动端口 其实 它的配置 还是非常多的 我们基础部分讲一下 后面 到实用部分 再一边用 一边再看一些 首先 我们如果不设置 他就会占用 我们的 8080端口 那么 我们最好就直接用 80端口 就不用输入端口…

【滤波】卡尔曼滤波数学

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第7章节07-Kalman-Filter-Math&#xff08;卡尔曼滤波数学&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 如果你已经学习到了这一步&#xff0c;我希望你…

vue基础知识一:说说你对vue的理解?

一、从历史说起 Web是World Wide Web的简称&#xff0c;中文译为万维网 我们可以将它规划成如下的几个时代来进行理解 石器时代 文明时代 工业革命时代 百花齐放时代 石器时代 石器时代指的就是我们的静态网页&#xff0c;可以欣赏一下1997的Apple官网 最早的网页是没有数据库…

day1 IO 模型

目录 基本概念 同步和异步 阻塞和非阻塞 线程在运行过程中&#xff0c;可能由于以下几种原因进入阻塞状态&#xff1a; 可能阻塞套接字的Linux Sockets API调用分为以下四种 五种 I/O 模型 阻塞I/O 非阻塞I/O ​编辑 I/O多路复用模型 信号驱动式I/O模型 异步I/O 模型 …

网络模块封装

网络模块封装 library-network模块配置依赖一.自定义LiveDataCallAdapterFactory1.定义ApiResponse返回的数据类型2.LiveDataCallAdapter.kt3.LiveDataCallAdapter.kt 二.自定义CustomGsonConverterFactory三.拦截器1.HeaderInterceptor请求头拦截器2.BasicParamsInterceptor参…

Android - 内容提供者(Content Provider) 使用

Android - 内容提供者(Content Provider) 内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库&#xff0c;文件&#xff0c;甚至是网络。 有时候需…

Python如何进行性能测试?(Locust对接口进行压测)

python如何进行性能测试呢&#xff1f;其实原理就是对于接口进行加线程&#xff0c;打个比方就是当你有一个电梯&#xff0c;你同时可以搭载多少个人坐电梯那这个人数就是这部电梯的其中一个性能指标&#xff0c;那么对于接口来说每秒钟能有多少人成功发起请求后得到成功的响应…

QT 学习笔记2 信号与槽

上次做的界面&#xff0c;并没有逻辑。你点击按钮&#xff0c;并不会执行什么 要想其能作出反映&#xff0c;就不得不提到一个很重要的机制---信号与槽 当我们点击确定的时候&#xff0c;按钮会发出一个信号 点击确定的时候&#xff0c;会执行一段代码&#xff0c;这段程序就…

Ada 语言学习(3)复合类型数据——Array

文章目录 Array数据类型声明数组索引数组范围数组复制数组初始化直接赋值通过拷贝赋值不同索引范围但长度相等非指定类型边界收缩 多维数组数组遍历数组切片访问和动态检查直接访问动态检查 数组字面量 Array literal数组拼接两个数组拼接数组和单个值拼接 Array Equality&…

机器学习平台 PAI 支持抢占型实例,模型服务最高降本 90%

助力模型推理服务降本增效&#xff0c;适用于推理成本敏感场景&#xff0c;如&#xff1a;AIGC 内容生成异步推理、批量图像处理、批量音视频处理等。 在 AI 开发及服务不断追求效率的背景下&#xff0c;阿里云机器学习平台 PAI 宣布支持抢占型实例&#xff08;Spot Instance&a…

2023逆向分析代码渗透测试flag0072解析(超详细)

一、竞赛时间 180分钟 共计3小时 1.从靶机服务器的FTP上下载flag0072,分析该文件,请提交代码保护技术的类型。提交格式:XXXX。 2.提交被保护的代码所在地址。提交格式: 0xXXXX。 3.提交代码解密的密钥。提交格式: 0xXX。 4.请提交输入正确flag时的输出。提交格式: XXXX。…

Python入门(十二)while循环(二)

while循环&#xff08;二&#xff09; 1.使用while循环处理列表和字典2.在列表之间移动元素3.删除为特定值的所有列表元素4.使用用户输入来填充字典 作者&#xff1a;xiou 1.使用while循环处理列表和字典 到目前为止&#xff0c;我们每次都只处理了一项用户信息&#xff1a;获…

建站教程:腾讯云轻量服务器安装宝塔面板搭建网站流程

腾讯云轻量应用服务器镜像选择宝塔Linux面板&#xff0c;然后在宝塔面板上安装LNMP网站所需的Web环境&#xff0c;在宝塔面板上新建站点&#xff0c;上床网站程序安装包到根目录&#xff0c;并安装网站全流程。腾讯云百科来详细说下腾讯云轻量应用服务器搭建网站全流程&#xf…

百果园ESG:围绕“好吃”二字,勾勒水果行业未来蓝图

当一场可持续绿色变革开始&#xff0c;ESG&#xff08;环境、社会与治理&#xff09;已经成为企业发展战略的重要组成部分。 然而&#xff0c;如何实现ESG和企业发展的协同却是一大问题。根据毕马威《2022年中国首席执行官展望》&#xff0c;一些企业家也表示ESG投资对提升财务…