【JavaScript】LeetCode:56-60

news2024/10/1 1:34:53

文章目录

  • 56 路径总和Ⅲ
  • 57 二叉树的最近公共祖先
  • 58 二叉树中的最大路径
  • 59 岛屿数量
  • 60 腐烂的橘子

56 路径总和Ⅲ

在这里插入图片描述

  • 递归
  • 遍历每个节点所有可能的路径。pathSum():返回所有节点满足条件的路径数目,traversal():返回当前遍历节点满足条件的路径数目。
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */

var traversal = function(root, targetSum){
    if(root == null){
        return 0;
    }
    let res = 0;
    if(root.val == targetSum){
        res += 1;
        //return res; 不能立刻返回,下面可能还有结果(一正一负)
    }
    res += traversal(root.left, targetSum - root.val);
    res += traversal(root.right, targetSum - root.val);
    return res;
}

/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number}
 */
var pathSum = function(root, targetSum) {
    if(root == null){
        return 0;
    }
    let ans = 0;
    ans += traversal(root, targetSum);
    ans += pathSum(root.left, targetSum);
    ans += pathSum(root.right, targetSum);
    return ans;
};

57 二叉树的最近公共祖先

在这里插入图片描述

  • 递归 + 后序遍历(自底向上查找)
  • 情况1:如果找到一个节点,左子树出现节点p,右子树出现节点q,或右子树出现节点p,左子树出现节点q,那么该节点为节点p和q的最近公共祖先。
  • 情况2:节点p或q本身就是最近公共祖先。
  • 如果遇到节点p或q就返回本身节点;如果一直没有遇到节点p或q,直到叶子节点,则返回null。
  • 遍历左右子树,用left和right承接返回结果。
  • 如果left和right都不为空,说明此时root就是最近公共节点。
  • 如果left为空,right / left不为空,就返回right / left,说明目标节点是通过right / left返回的。
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
    var traversal = function(root, p, q){
        if(root == null){
            return null;
        }
        if(root == p || root == q){
            return root;
        }
        let left = traversal(root.left, p, q);
        let right = traversal(root.right, p, q);
        if(left != null && right != null){
            return root;
        }else if(left == null && right != null){
            return right;
        }else if(left != null && right == null){
            return left;
        }else{
            return null;
        }
    }
    return traversal(root, p, q);
};

58 二叉树中的最大路径

在这里插入图片描述

  • 递归 + 后序遍历
  • 以节点root为根的最大路径和sum = root.val + 左子树的返回值 + 右子树的返回值
  • 每个节点root的返回结果 = root.val + max(左子树的返回值,右子树的返回值)
  • 不断更新结果maxSum = max(maxSum,sum)
  • 最后结果返回max(maxSum,0),例如:如果右子树是负数,那路径就不需要走右子树了,因为路径和会越加越小。
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
    var traversal = function(root){
        if(root == null){
            return  0;
        }
        let left = traversal(root.left);
        let right = traversal(root.right);
        let sum = root.val + left + right;
        maxsum = Math.max(maxsum, sum);
        res = root.val + Math.max(left, right);
        return Math.max(res, 0);
    }
    let maxsum = -Number.MAX_VALUE;
    traversal(root);
    return maxsum;
};

59 岛屿数量

在这里插入图片描述

  • DFS
  • 主函数:numIslands,双层for循环遍历网格点,如果该网格点为岛屿且没有被访问过,调用递归函数。
  • 递归函数:dfs,网格点遍历上、右、下、左资格方向,若该方向上的点越界或已经被访问,continue;否则判断该方向上的点是否为岛屿,若为岛屿则继续递归。
/**
 * @param {character[][]} grid
 * @return {number}
 */
var numIslands = function(grid) {
    var dfs = function(grid, vis, x, y){
        let dirt = [[1, 0], [0, 1], [-1, 0], [0, -1]];
        for(let i = 0; i < 4; i++){
            let x_ = x + dirt[i][0];
            let y_ = y + dirt[i][1];
            if(x_ < 0 || x_ >= n || y_ < 0 || y_ >= m || vis[x_][y_] == 1){
                continue;
            }
            if(grid[x_][y_] == '1'){
                vis[x_][y_] = 1;
                dfs(grid, vis, x_, y_);
            }
        }
    }
    let n = grid.length;
    let m = grid[0].length;
    let vis = Array(n).fill(null).map(() => Array(m).fill(0));
    let res = 0;
    for(let i = 0; i < n; i++){
        for(let j = 0; j < m; j++){
            if(!vis[i][j] && grid[i][j] == '1'){
                dfs(grid, vis, i, j);
                res += 1;
            }
        }
    }
    return res;
};

60 腐烂的橘子

在这里插入图片描述

  • BFS
  • 双层for循环遍历单元格,记录新鲜橘子的个数fresh,并将腐烂的橘子记录到队列queue中。
  • 逐层遍历队列中的元素,每遍历一层分钟数 + 1,直到队列为空。
  • 遍历腐烂橘子的四个方向:上、右、下、左,若该方向上的橘子是新鲜的,则新鲜橘子个数 - 1,变为腐烂橘子。
  • 若最后所有橘子都变成了腐烂的,则返回分钟数,否则说明还存在新鲜橘子,该橘子永远都不能变为腐烂橘子,返回 -1。
  • 最后返回的分钟数应该 - 1,因为刚开始处理队列中第一个元素时,就已经 + 1了,因此结果也多加了1。
/**
 * @param {number[][]} grid
 * @return {number}
 */
var orangesRotting = function(grid) {
    let n = grid.length;
    let m = grid[0].length;
    let dirt = [[1, 0], [0, 1], [-1, 0], [0, -1]];
    let queue = [];
    let fresh = 0;
    let res = 0;
    for(let i = 0; i < n; i++){
        for(let j = 0; j < m; j++){
            if(grid[i][j] == 1){
                fresh += 1;
            }else if(grid[i][j] == 2){
                queue.push([i, j]);
            }
        }
    }
    if(fresh == 0){
        return 0;
    }
    while(queue.length){
        res += 1;
        let temp = queue;
        queue = [];
        for(let [x, y] of temp){
            for(let d = 0; d < 4; d++){
                let x_ = x + dirt[d][0];
                let y_ = y + dirt[d][1];
                if(x_ >= 0 && x_ < n && y_ >= 0 && y_ < m && grid[x_][y_] == 1){
                    queue.push([x_, y_]);
                    grid[x_][y_] = 2;
                    fresh -= 1;
                }
            }
        }
    }
    return fresh? -1: res - 1;
};

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

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

相关文章

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限&#xff0c;穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

基于Apache和Tomcat的负载均衡实验报告

说明&#xff1a;本实验为浙江科技大学软件工程本科专业课程《软件体系结构》的实验报告。 五、总结 负载均衡的基础是集群&#xff0c;集群就是一组连在一起的计算机&#xff0c;从外部看它是一个系统&#xff0c;各节点可以是不同的操作系统或不同的硬件构成的计算机。负载…

【d56】【sql】完成sql 7题目

... 有一题感觉没意义&#xff0c;直接不刷

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…

TCP-2;CSNSDWSSC;肿瘤血管及M1型巨噬细胞靶向肽

【TCP-2 简介】 TCP-2&#xff08;Tumor-conditioned medium-stimulated Clone-2&#xff09;是一种特定的靶向肽&#xff0c;主要针对肿瘤微环境中的肿瘤血管和M1型巨噬细胞。这种肽在肿瘤治疗领域显示出巨大的潜力&#xff0c;尤其是在提高药物递送的精确性、增强免疫介导的抗…

【网络安全】绕过 Etplorer 管理面板实现RCE

未经许可,不得转载。 文章目录 正文使用 ffuf 进行FUZZ查找漏洞漏洞复现目标网站:https://app.redacted.com 正文 使用 ffuf 进行FUZZ ffuf -u https://app.redacted.com/FUZZ -w wordlist.txt -c -r-c:表示彩色输出,方便用户在终端中查看结果。 -r:忽略响应中的重定向…

【重学 MySQL】四十三、多行子查询

【重学 MySQL】四十三、多行子查询 使用 IN 子查询示例&#xff1a;查找属于特定部门的员工 使用 ANY 和 ALL 子查询使用 ANY使用 ALL 注意事项 在 MySQL 中&#xff0c;多行子查询&#xff08;也称为 IN 子查询&#xff09;是指子查询返回多行数据&#xff0c;并且这些数据用于…

新质农业——水资源可持续管理

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

基于SpringBoot+Vue的服装销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C++ | Leetcode C++题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map<long long, int> prefix;int dfs(TreeNode *root, long long curr, int targetSum) {if (!root) {return 0;}int ret 0;curr root->val;if (prefix.count(curr - targetSum)) {ret pref…

CaChe的基本原理

目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache&#xff0c;即高速缓冲存储器&#xff0c;是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度&#xff0c;从而优化系…

YOLOv8改进 - 注意力篇 - 引入SCAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SCAM注意力在YOLOv8中的使用。包含SCAM原理分析&#xff0c;SCAM的代码、SCAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SCAM原理分析 SCAM官方论文地址&#xff1a;SCAM文章 SCAM官方代码地址&#xff1a;SC…

解决 Macos下 Orbstack docker网络问题

两种解决方法&#xff0c;第一种开代理 参考 —— 但是我这一种没成功&#xff0c;第二种方法是换镜像源 { "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://mirrors.tencent.com&q…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

大麦演唱会门票

切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉&#xff0c;于购票环节&#xff0c;大麦凭借恶意流量清洗技术&#xff0c;于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量&#xff0c;强化对刷票脚本、刷票软件以及虚拟设备的识别能力&#…

开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的数据运营策略与价值创造

一、引言 1.1 研究背景 在当今数字化时代&#xff0c;数据运营已成为企业发展的核心驱动力。开源 AI 智能名片 21 链动模式 S2B2C 商城小程序作为一种创新的营销工具&#xff0c;与数据运营紧密相连。该小程序通过集成人工智能、大数据分析等先进技术&#xff0c;能够实时收集…

【问题解决】Xshell终端双击或者选中文字自动发送Ctrl+C

问题 在xshell终端&#xff0c;当鼠标双击或者选中一行文字时&#xff0c;xshell会自动发送一个 CtrlC 的命令。如下图&#xff1a; 原因 已知可能会导致这个问题的软件&#xff0c;关掉就没问题了&#xff1a; 有道词典金山词典词霸秒译bing翻译钉钉AI助理360极速搜索… …

Python保留数据删除Excel单元格的函数和公式

在分析处理Excel表格时&#xff0c;我们可能需要使用各种公式或函数对表格数据进行计算&#xff0c;从而分析出更多的信息。但在展示、分享或再利用分析结果时&#xff0c;我们可能需要将含有公式的单元格转换为静态数值&#xff0c;从而简化数据、保护计算结果不被更改&#x…

(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

//内存四区&#xff1a;1.代码区 2.全局区 3.栈区 4.堆区 1.放在代码区的有&#xff1a;1.写的代码&#xff1a;只读的、共享的、存放的二进制机器指令、由操作系统直接管理 2.放在全局区的有&#xff1a;1.全局的&#xff08;变量或常量&#xff09; 2.静态的&#xff0…

【毕业/转行】想从事GIS开发工程师?如何规划?

既然是GIS开发&#xff0c;那就离不开学习编程 那如何学习才能掌握呢?如何才能达到企业的用人标准? 给大家梳理了学习的路线&#xff0c;想从事gis开发的小伙伴可以直接按这个路线学习! 共分为6大阶段&#xff0c;让你从纯小白到成熟的三维GIS开发工程师! 大纲&#xff1a…