【LeetCode热题100】打卡第31天:买卖股票的最佳时机二叉树中的最大路径和

news2024/9/17 8:19:34

文章目录

  • 【LeetCode热题100】打卡第31天:买卖股票的最佳时机&二叉树中的最大路径和
    • ⛅前言
  • 买卖股票的最佳时机
    • 🔒题目
    • 🔑题解
  • 二叉树中的最大路径和
    • 🔒题目
    • 🔑题解

【LeetCode热题100】打卡第31天:买卖股票的最佳时机&二叉树中的最大路径和

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

Github地址📁:Chinafrfq · GitHub

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

买卖股票的最佳时机

🔒题目

原题链接:121.买卖股票的最佳时机

image-20230702114800884

🔑题解

  • 解法一暴力(超时)

    class Solution {
        public int maxProfit(int[] prices) {
            int max = 0;
            for (int i = 0; i < prices.length; i++) {
                for (int j = i + 1; j < prices.length; j++) {
                    int price = prices[j] - prices[i];
                    if (price > max) {
                        max = price;
                    }
                }
            }
            return max;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
    • 空间复杂度: O ( 1 ) O(1) O(1)

    其中 n n n 为数组中元素的个数

    代码优化动态规划(时间优化)

    前面我们使用最为简单的暴力枚举,可以发现有很多重复性的计算,每次我们都需要去循环遍历重复计算当前元素左侧最大的一个元素,这显然是没有必要的,我们可以使用使用 一个 dp 数组来记录当前元素右侧最小的元素,我们从前往后遍历,①比当前元素小要么是上一个元素左侧最小值,②要么左侧没有比当前元素小的,那么当前的dp应该设置为当前元素,所以最终的动态转移方程就可以是dp[i]=Math.min(dp[i-1],prices[i])

    class Solution {
        public int maxProfit(int[] prices) {
            int[] dp = new int[prices.length];
            // 这里需要初始化第一个元素,从第二个元素开始进行状态转移计算
            dp[0] = prices[0];
            for (int i = 1; i < prices.length; i++) {
                dp[i] = Math.min(dp[i - 1], prices[i]);
            }
            int max = 0;
            for (int i = 0; i < prices.length; i++) {
                max = Math.max(max, prices[i]-dp[i]);
            }
            return max;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( n ) O(n) O(n)

    其中 n n n 为数组中元素的个数

    代码优化利用一个变量来记录左侧最小值(时间和空间优化)

    上面我们使用动态规划,利用一个 dp 数组来记录当前元素左侧最小值,我们可以惊奇的发现在使用 dp 时,我们并没有用到 dp[i] 右侧的元素,我们可以完全省掉这个数组,改用一个变量来记录当前元素左侧最小值,同时也只需要一次循环,在从左往右遍历的过程中就能够实现左侧最小值的更新,以及当前值的计算,这样既节省了内存消耗,又节省了时间消耗,从而大大提高代码的性能

    class Solution {
        public int maxProfit(int[] prices) {
            int leftMin = prices[0];
            int max = 0;
            for (int i = 0; i < prices.length; i++) {
                leftMin = Math.min(leftMin, prices[i]);
                max = Math.max(max, prices[i] - leftMin);
            }
            return max;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( 1 ) O(1) O(1)

    其中 n n n 为数组中元素的个数

二叉树中的最大路径和

🔒题目

原题链接:124.二叉树中的最大路径和

image-20230702114835748

🔑题解

  • 解法一:递归

    题解大致思路:首先我们需要理解题目的意思,先是理解什么是路径,其实就是 一笔画能够得到路径的最大值

    image-20230703183910079

    上面这棵树的最大路径和,就是7+11+4+8+13=48

    image-20230703184050535

    以3为根节点,组成的二叉树只有3,此时这棵树所有节点能够组合起来的最大值就是3,同理可以知道4、和6的最大路径分别是它们本身;现在以2为根节点,组成的二叉树就是 2,3,4,此时这颗树组和起来的最大值就是 9,同理可以计算出 -8的最大路径是-2,而1的最大路径是 2、4、1,也就是7,因为1的右子树小于0,所以最大路径的组合不需要右子树,左子树我们要选用左节点左右子树中较大路径,左节点,也就是Math.max(cur.left.left, cur.left.left)

    通过上面对题目的解析,其实我们可以总结出一个计算公式,也就是当前节点能够形成的最大路径是cur.val+Math.max(cur.left, 0)+Math.max(cur.right, 0),这个公式的意思就是当前节点 cur 能够形成的最大路径的组成是当前值 cur.val还有左子树构成路径的最大值,如果左子树的最大值小于0,则直接舍弃,还有右子树构成路径的最大值,同理小于0直接舍弃。但是对于

    class Solution {
        private int maxPathSum = Integer.MIN_VALUE;
    
        public int maxPathSum(TreeNode root) {
            calculateMaxPathSum(root);
            return maxPathSum;
        }
    
        private int calculateMaxPathSum(TreeNode root) {
            if (root == null) {
                return 0;
            }
            // 计算左子树的最大路径和
            int leftMax = Math.max(calculateMaxPathSum(root.left), 0);
            // 计算右子树的最大路径和
            int rightMax = Math.max(calculateMaxPathSum(root.right), 0);
            // 当前节点能够构成的最大路径和
            int curMax = root.val + Math.max(leftMax, 0) + Math.max(rightMax, 0);
            // 更新目前最大路径和
            maxPathSum = Math.max(maxPathSum, curMax);
    
            // 返回子节点下左右子树中较大的路径和
            return root.val + Math.max(leftMax, rightMax);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n),需要访问每一个节点
    • 空间复杂度: O ( n ) O(n) O(n),递归的次数取决于树的高度,最好情况(树是一颗完全平衡二叉树) l o g n logn logn,最坏情况(树是单链表) n n n

    其中 n n n 为数组中元素的个数

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

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

相关文章

Hello Vue3

一、为什么要学vue3 vue官网&#xff1a;https://cn.vuejs.org/api/ 这是vue官网的简介&#xff0c;说vue2在23年年底就停止维护了&#xff0c;将来会拥抱vue3,这是事务发展的一个必然趋势。 二、vue3相比于vue2做了哪些方面的改进和优化 以下是Vue3相比于Vue2的一些改进和…

DAY37:贪心算法(四)跳跃游戏+跳跃游戏Ⅱ

文章目录 55.跳跃游戏思路完整版总结 45.跳跃游戏Ⅱ思路完整版为什么next覆盖到了终点可以直接break&#xff0c;不用加上最后一步逻辑梳理 总结 55.跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃…

weui 密码二次检查校验

检验规则里rules[]增加: equalTo:需要匹配一致的字段名 我这第一个密码是&#xff1a;USR_PWD&#xff0c;第二个密码是&#xff1a;USR_PWD2,让第二个等于第一个就可以了&#xff1a; equalTo:USR_PWD 效果&#xff1a;

MIT 6.S081 教材第七章内容 -- 调度 --下

MIT 6.S081 教材第七章内容 -- 调度 -- 下 引言调度多路复用代码&#xff1a;上下文切换代码&#xff1a;调度代码&#xff1a;mycpu和myprocsleep与wakeup代码&#xff1a;sleep和wakeup代码&#xff1a;Pipes代码&#xff1a;wait, exit和kill真实世界练习 引言 MIT 6.S081 …

0基础学习VR全景平台篇 第54篇: 高级功能-皮肤

功能位置示意 一、本功能将用在哪里&#xff1f; 皮肤功能&#xff0c;摆脱传统VR全景展示样式&#xff0c;自行选择场景与全景分组的界面模板&#xff0c;从而与不同的应用行业风格相互适应&#xff0c;达到最贴切的展示效果。 是在各种风格的VR全景作品中&#xff0c;最快实…

C++ DAY5

1.全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){monster-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属…

前端web入门-移动web-day09

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 空间转换 空间转换 – 平移 视距 perspective 空间 – 旋转 立体呈现 – transform-style 空间转换…

Docker学习笔记16

在生产环境中使用Docker&#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行数据共享。 容器管理数据有两种方式&#xff1a; 1&#xff09;数据卷&#xff1a;容器内数据直接映射到本地主机环境&#xff1b; 2&#xff09;数据卷容器&#xff1a;…

服务器远程管理工具Xshell安装及使用,传输文件工具安装及使用

两个软件 Xshell 双击输入用户名和密码 也可以通过密钥的方式 怎么生成密钥还没做过 Xftp 一边主机一边服务器&#xff0c;相互拖动就行了

【C#】并行编程实战:实现数据并行(3)

本章继续学习实现数据并行&#xff0c;本文主要介绍取消循环。 本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 4、取消循环 在顺序循环中&#xff0c;可以使用 break 来跳出循环&#xff0c;而在并行循环的情况下&#xff0c;由于他…

Unity协程

unity提供了一种类似“多段代码并行执行”的功能&#xff0c;即协程。 我们在定义一个协程的时候&#xff0c;需要遵循类似这样的语法 IEnumerator&#xff08;枚举器接口&#xff09; namespace System.Collections {public interface IEnumerator{object Current { get; }/…

卷积神经网络--猫狗系列【VGG16】

数据集&#xff1a;【文末】 ​ 数据集预处理 定义读取数据辅助类&#xff08;继承torch.utils.data.Dataset&#xff09; import osimport PILimport torchimport torchvisionimport matplotlib.pyplot as pltimport torch.utils.dataimport PIL.Image # 数据集路径train_p…

哈希桶的增删查改简单实现

个人简单笔记。 目录 闭散列 开散列 插入 删除 查找 改变 什么是哈希桶呢&#xff1f;这是一个解决哈希数据结构的一种解决方法&#xff0c;在STL中的unorder_map与unorder_set的底层结构就是使用它来实现的。 闭散列 首先我们知道&#xff0c;哈希映射表是依据数组下…

CSS画特殊边框

例如如图所示边框 .card-middle {width: 672px;height: 486px;border: 1px solid #5fadec;border-radius: 5px;position: relative; }.card-middle::before {content: ;position: absolute;top: -4px;left: -4px;width: 680px;height: 448px;border: 25px solid transparent;b…

【Python】PIL.Image转QPixmap后运行异常的个人解决方法

问题场景&#xff1a; PIL.Image图片&#xff0c;直接调用PIL.Image.toqpixmap()转成QPixmap后&#xff0c;不会立即报错&#xff0c;   但后续使用该QPixmap时(包括但不仅限于使用QLabel.setPximap()、QPixmap.save())将立即出现异常 不知道是我关键词不对&#xff0c;还是只…

【数据结构与算法】文学语言助手(C\C++)

实践要求 1. 问题描述 文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统&#xff0c;称为"文学研究助手"。 2. 基本要求 英文小说存于文本文件中。待统计的词汇集合要一次输入完毕&#xff0c;即统计工作必需在…

linux常用命令介绍 06 篇——Linux查看目录层级结构以及创建不同情况的层级目录

linux常用命令介绍 06 篇——Linux查看目录层级结构以及创建不同情况的层级目录 1. 前言1.1 Linux常用命令其他篇1.2 关于tree简介 2. 安装并使用 tree2.1 安装tree2.1.1 方式1&#xff1a;yum安装2.1.2 方式2&#xff1a;下载安装包安装2.1.2.1 下载安装包2.1.2.2 解压安装2.1…

transformer入坑指南

*免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一: Attention is all you need 场景二: VIT 场景三: Swin v1 场景四: Swin v2 场景五: SETR 场景六: TransUNet 场景七: SegFormer 场景八: PVT 场景九: Segmeter … 场景一:Attention…

Spring Boot 中的 Spring Cloud Ribbon:什么是它,原理及如何使用

Spring Boot 中的 Spring Cloud Ribbon&#xff1a;什么是它&#xff0c;原理及如何使用 在分布式系统中&#xff0c;服务之间的通信是非常重要的。在大型的分布式系统中&#xff0c;有许多服务需要相互通信&#xff0c;而这些服务可能会部署在多个服务器上。为了实现服务之间…

超详细Redis入门教程——Redis分布式系统

前言 本文小新为大家带来 Redis分布式系统 相关知识&#xff0c;具体内容包括数据分区算法&#xff08;包括&#xff1a;顺序分区&#xff0c;哈希分区&#xff09;&#xff0c;系统搭建与运行&#xff08;包括&#xff1a;系统搭建&#xff0c;系统启动与关闭&#xff09;&…