算法题解析与总结(二)

题目要求

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

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

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

思路

路径每到一个节点,只有3中选择:①停在当前节点。②走到左子节点。 ③走到右子节点。

走到子节点,又有三种选择,递归就是用来处理规模不一样的相同问题。

注意:不能走进一个分支又掉头。

定义递归函数

  • dfs函数:返回当前子树能向父节点提供的最大路径和maxSum,①子树根节点,收益为root.val ②左子树收益root.val+dfs(root.left) ③右子树收益root.val + dfs(root.right)
  • 当遍历到root 节点时,返回0;
  • 如果遇到负数,像null一样放回0;

子树内部路径要包含根节点

  • 每递归一个子树,都求一下当前子树内部的最大路径和,再从中比较出最大的。
  • 子树内部最大路径和innerMaxSum = 左子树提供的最大路径和dfs(root.left) + 根节点 root.val + 右子树提供的最大路径和 dfs(root.right)

var maxPathMax = function(root){
	// 最大路径和,Number.MIN_SAFE_INTEGER最小最安全的integer型数字
    let maxSum = Number.MIN_SAFE_INTEGER;
    // dfs 函数,递归求子最大路径和
    const dfs = (root) => {
		// 筛选root中的空节点
        if(root == null){
            return 0;
        }
        // 左子树最大路径和
        const left = dfs(root.left);
        // 左子树最大路径和
        const right = dfs(root.right);
        
        // 子树内部最大路径和 = 做子树 + 根节点 + 右子树
        const innerMaxSum = left + root.val + right;
        // 更新maxSum值
        maxSum = Math.max(maxSum, innerMaxSum);
        
        // 子树向外提供最大路径和
        const outputMaxSum = root.val + Math.max(left, right);
        // 返回时检查有没有负数 
        return outputMaxSum < 0 ? 0 : outputMaxSum;
    };
    dfs(root); // 入口
    return maxSum;
}

二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

image-20210830150201234

思考:

根据题意已知,二维数组从左往右递增,从上往下递增,所以得出以下结论:

某列的某个数字,该数之上的数字,都比其小;
某行的某个数字,该数右侧的数字,都比其大;
所以,解题流程如下所示:

以二维数组左下角为原点,建立直角坐标轴。
若当前数字大于了查找数,查找往上移一位。
若当前数字小于了查找数,查找往右移一位。

二维数组中的查找

var findNumberIn2DArray = function(matrix, target) {
    // 设置边界
    if(!matrix.length) return false;
    // 初始化右下角设置坐标
    let x = matrix.length - 1, y = 0;
    // 当x轴大于等于0 && y轴小于二维数组长度
    while(x >= 0 && y < matrix[0].length ){
        // 如果当前值 大于 目标值
        if(matrix[x][y] === target){
            return true;
        }else if(matrix[x][y] > target){
            // x轴上移 
            x--;
        }else{
            y++;
        }
    }
    return false;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音哪些方法不违规还能导流到微信?

抖音作为当前最热门的短视频应用之一&#xff0c;其日活跃用户已经超过6亿。仅仅在抖音上玩乐是不够的&#xff0c;如果你想通过抖音赚钱&#xff0c;你需要掌握如何有效地引流。目前&#xff0c;微信是私域流量的最佳载体&#xff0c;因为它是一个成熟且庞大的生态系统&#x…

【工具】使用ssh进行socket5代理,ssh端口转发

文章目录 shellssh命令详解正向代理&#xff1a;反向代理&#xff1a;本地 socks5 代理 ssh端口转发开启 shell ssh -D 3333 root192.168.0.11 #输入密码 #3333端口已经使用远程机进行转发设置Windows全局代理转发 socks127.0.0.1 3333如果远程机为公网ip&#xff0c;可通过…

消息中间件之RocketMQ事务消息流程(二)

所谓事务消息就是基于消息中间件模拟的两阶段提交(2PC)&#xff0c;属于对消息中间件的一种特殊利用。总体思路如下: 1.系统A先向消息中间件发送一条预备消息(Half Message)&#xff0c;消息中间件在保存好消息之后向系统A发送确认消息 2.系统A执行本地事务 3.系统A根据本地事务…

CPU 如何识别用户空间不同进程的虚拟地址

前言 一个疑问&#xff1a;CPU 运行两个 test.out 进程&#xff0c;使用的是各自进程的虚拟地址&#xff0c;那 CPU 是如何识别出当前这个虚拟地址是属于哪个进程的&#xff1f;带着这个疑问&#xff0c;我们一起开始今天的探索 如上图&#xff0c;CPU 是如何知道 0x4785c4 这…

docker设置代理解决内网pull外网镜像

目录 Docker 配置代理的缘由 通过dockerd配置实现代理 通过container配置实现代理 参考文献 Docker 配置代理的缘由 如何在内网环境内环境内Pull外网registry&#xff0c;或者反过来想要Pull公司Registry镜像&#xff1f;存在上述需求的朋友可以尝试以下方法进行docker代理…

《小学生作文辅导》期刊投稿邮箱

《小学生作文辅导》是国家新闻出版总署批准的正规教育类期刊&#xff0c;适用于全国各小学语文老师事业单位及个人&#xff0c;具有原创性的学术理论、工作实践、科研成果和科研课题及相关领域等人员评高级职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;。 栏目…

OpenHarmony 鸿蒙使用指南——概述

简介 OpenHarmony采用多内核&#xff08;Linux内核或者LiteOS&#xff09;设计&#xff0c;支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时&#xff0c;如何能够让设备驱动程序在不同内核间平滑迁移&#xff0c;消除驱动代码移植适配和维护的负担&#xff0c;…

linux环境开发工具---yum与vim

1.Linux软件包管理器yum 1.1什么是软件包 在学习linux过程中&#xff0c;我们常常会遇到某些指令用不了的时候&#xff0c;原因除了权限问题外&#xff0c;还有可能是你当前的linux环境并没有安装相应的软件包。而在Linux下载安装软件的办法有两个&#xff0c;一个是先下载所需…

RHCE【报警脚本】

要求如下&#xff1a; 根分区剩余空间小于20% 发送告警邮件给自己 配合crond每5分钟检查一次脚本 报警脚本的具体实现如下&#xff1a; #安装mailx(邮件服务包)[rootlocalhost ~]# yum install mailx #编辑邮件系统文件[rootlocalhost ~]# vim /etc/mail.rc#首先注…

远程连接银河麒麟

目录 一、防火墙服务 二、安装SSH服务 1.验证SSH服务是否安装 2.安装SSH服务 三、启动SSH服务 四、远程连接 1.切换登录用户 2.查看IP地址 3.FinalShell连接 4.切换root用户 前言: 本篇主要讲述在Win10系统中通过FinalShell远程连接银河麒麟桌面操作系统V10 一、防火…

UI Automator 常用 API 整理

主要类&#xff1a; import android.support.test.uiautomator.UiDevice;作用&#xff1a;设备封装类&#xff0c;测试过程中获取设备信息和设备交互。 import android.support.test.uiautomator.UiObject;作用&#xff1a;所有控件抽象&#xff0c;用于表示一个Android控件。…

LeetCode.670. 最大交换

题目 题目链接 分析 这道题的意思是我们只能交换一次&#xff0c;需要得到最大的数字。 我们的第一个想法就是要这个数字先变成一个数组&#xff0c;便于我们操作。 然后把数组最大的数放到第一个位置&#xff0c;如果最大的数字已经在第一个位置&#xff0c;那么就把次大的…

k8s之ingress

ingress基于域名进行映射&#xff0c;把url(http https)的请求转发到service&#xff0c;再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB&#xff0c;可以把多个http请求暴露到外网&#xff0c;七层反向代理 理解为service的service&#xff0c;是…

windows11上安装虚拟机VMware

1、安装虚拟机&#xff08;待补充&#xff09; 第二步&#xff1a;安装VMware tools 实现windows文件上传到虚拟机中 1、安装好虚拟机后&#xff0c;查看虚拟机ip用Xshell连接虚拟机&#xff0c;并安装VMware tools(只有安装了VMware tools才能实现虚拟机和本机的文件共享。在…

shell脚本概念构成及脚本变量详解

目录 一、前言 1、程序编程风格 2、编程语言 3、编程的三种处理逻辑 二、shell脚本 1、shell脚本基础 1.1 什么是shell 1.1.1 shell的概念 1.1.2 linux中常见的shell类型及信息 1.1.3 shell脚本的功能 1.2 shell脚本及构成 1.3 shell脚本执行方式 1.4 脚本错误调试…

leetcode 670. 最大交换

题目&#xff1a; 解题方法 1.将整数转换成列表 2.从列表第一个数开始&#xff0c;每取出一次&#xff0c;找出列表余下数据&#xff08;列表list1&#xff09;的最大值,若取出的值小于list1的最大值&#xff0c;说明需要进行置换&#xff0c;置换处理&#xff1a; 找出lis…

基于51单片机开发的语音存储播放系统

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1Ei4y1s7Jc/?vd_source6ff7cd03af95cd504b60511ef9373a1d 系统简介&#xff1a; 系统由单片机STC89C52、功率放大器、语音芯片ISD4004-16、液晶LCD1602、独立按键、扬声器等组成&#xff0c;用户可以通过按键设…

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…

蓝桥杯Java组备赛(比赛环境:eclipse安装配置,hello world运行,常规操作配置)

目录 1.官方开发环境2.Eclipse安装1.官网下载2.本地安装3.编写helloworld 3.Eclipse操作优化1.设置自动补全代码2.常用快捷键3.调节字体大小和主题 1.官方开发环境 赛事大纲网址&#xff1a; https://dasai.lanqiao.cn/notices/846/2.Eclipse安装 1.官网下载 网址&#xff…

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…