力扣爆刷第161天之TOP100五连刷71-75(搜索二叉树、二维矩阵、路径总和)

力扣爆刷第161天之TOP100五连刷71-75(搜索二叉树、二维矩阵、路径总和)

文章目录

      • 力扣爆刷第161天之TOP100五连刷71-75(搜索二叉树、二维矩阵、路径总和)
      • 一、98. 验证二叉搜索树
      • 二、394. 字符串解码
      • 三、34. 在排序数组中查找元素的第一个和最后一个位置
      • 四、113. 路径总和 II
      • 五、240. 搜索二维矩阵 II

一、98. 验证二叉搜索树

题目链接:https://leetcode.cn/problems/validate-binary-search-tree/description/
思路:验证二叉搜索树,二叉搜索数要求任意节点大于左孩子,小于右孩子。这么来看二叉搜索树的中序遍历正好是单调递增序列,所以要判断是否是二叉搜索树,只需要使用中序遍历,并且记录前一个节点的值,用来比较即可。

class Solution {
    TreeNode pro = null;
    boolean flag = true;
    public boolean isValidBST(TreeNode root) {
        traverse(root);
        return flag;
    }

    void traverse(TreeNode root) {
        if(root == null || !flag) return ;

        traverse(root.left);
        if(pro != null && pro.val >= root.val) {
            flag = false;
            return;
        }
        pro = root;
        traverse(root.right);
    }
}

二、394. 字符串解码

题目链接:https://leetcode.cn/problems/decode-string/description/
思路:类似于拼接字符串,又带有左右括号,一般看到左右括号类型的题目都要考虑一下,能不能使用栈来做,因为一般左右匹配都是使用栈。本题仔细思考可以发现确实是的,类似于计算表达式,使用两个栈,一个是数字栈,一个是字符串栈,每次遇到左括号就把收集到的字符串和数字压栈,然后启用一个新的字符串和数字记录最新的左括号内的内容,直到遇到右括号,就可以根据数字栈内的内容复制次数,然后拼接字符串栈栈顶元素,以此往复即可。
在这里插入图片描述

class Solution {
    
    public String decodeString(String s) {
        LinkedList<Integer> stk1 = new LinkedList<>();
        LinkedList<String> stk2 = new LinkedList<>();
        StringBuilder res = new StringBuilder();
        int num = 0;
        for(char c : s.toCharArray()) {
            if(c >= '0' && c <= '9') {
                num = num * 10 + Integer.parseInt(c + "");
            }else if(c == '[') {
                stk1.push(num);
                num = 0;
                stk2.push(res.toString());
                res = new StringBuilder();
            }else if(c == ']') {
                StringBuilder t = new StringBuilder();
                int count = stk1.pop();
                for(int i = 0; i < count; i++) {
                    t.append(res);
                }
                res = new StringBuilder(stk2.pop() + t);
            }else{
                res.append(c);
            }
        }
        return res.toString();
    }

    
}

三、34. 在排序数组中查找元素的第一个和最后一个位置

题目链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/
思路:求排序数组中目标元素出现的最左位置和最右位置,其实就是采用二分查找,分开查找,先查找左边界再查找右边界。然后注意边界条件,即元素是否存在,查出来的边是否超界。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = findLeft(nums, target);
        int right = findRight(nums, target);
        return new int[]{left, right};
    }

    int findLeft(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] >= target) {
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        if(left < 0 || left >= nums.length) return -1;
        return nums[left] == target ? left : -1;
    }


    int findRight(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] <= target) {
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        if(right < 0 || right >= nums.length) return -1;
        return nums[right] == target ? right : -1;
    }
    
}

四、113. 路径总和 II

题目链接:https://leetcode.cn/problems/path-sum-ii/description/
思路:求和满足目标的路径,相当于在二叉树上做回溯,从上往下进行搜索,本质还是回溯,只需要把前序位置收集,在后序位置丢弃,对应了回溯的开始与结束,后序位置表示左右子树都遍历完了要返回上一级,自然需要删除收集的元素完成回溯。

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    int sum = 0;
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        backTracking(root, targetSum);
        return result;
    }

    void backTracking(TreeNode root, int targetSum) {
        if(root == null) return;
        
        sum += root.val;
        list.add(root.val);

        if(root.left == null && root.right == null && sum == targetSum) {
            result.add(new ArrayList(list));
        }
        backTracking(root.left, targetSum);
        backTracking(root.right, targetSum);

        list.remove(list.size()-1);
        sum -= root.val;
        
    }
}

五、240. 搜索二维矩阵 II

题目链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/description/
思路:搜索二维矩阵,这个二维矩阵有一个特点,就是从左往右是递增的,从上往下是递增,那么也就在右上角构成了一个分界线,可以从这个位置开始深度优先搜索,如果当前元素小于目标元素,那就向下搜索,如果当前元素大于目标元素,那就是向左搜索。
在这里插入图片描述

class Solution {
    boolean flag = false;
    public boolean searchMatrix(int[][] matrix, int target) {
        dfs(matrix, target, 0, matrix[0].length-1);
        return flag;
    }

    void dfs(int[][] matrix, int target, int x, int y) {
        if(x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length) return;
        if(matrix[x][y] == target) {
            flag = true;
            return;
        }else if(matrix[x][y] > target) dfs(matrix, target, x, y-1);
        else dfs(matrix, target, x+1, y);
    }
}

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

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

相关文章

idea Git操作

1、代码拉取&#xff08;左上角&#xff09; 或 2、代码push&#xff08;左上角&#xff09; 3、切换分支&#xff08;右下角&#xff09; 4、分支管理 5、当前分支和某一个分支对比差异 6、当前分支某一个提交需要恢复成提交前状态&#xff08;revert&#xff09; 7、其他分…

信息技术课上的纪律秘诀:营造有序学习环境

信息技术课是学生们探索数字世界的乐园&#xff0c;但同时也是课堂纪律管理的挑战场。电脑、网络、游戏等元素可能分散学生的注意力&#xff0c;影响学习效果。本文将分享一些有效的策略&#xff0c;帮助教师在信息技术课上维持课堂纪律&#xff0c;确保教学活动顺利进行。 制…

简过网:快来看看你的专业能考哪个类型的事业单位?

你的专业能考哪个类型的事业单位&#xff0c;你知道吗&#xff1f;想考事业单位的姐妹&#xff0c;一定要在备考之前&#xff0c;查清楚你的专业适不适合考事业单位、考哪类事业编以及能报考哪些岗位&#xff1f;这个才能上岸的几率更高一些&#xff01; 事业单位有5类岗位&am…

安全防御(防火墙)

第二天&#xff1a; 1.恶意程序---一般会具有一下多个或则全部特点 1.非法性&#xff1a;你未经授权它自动运行或者自动下载的&#xff0c;这都属于非法的。那恶意程序一般它会具有这种特点&#xff0c; 2.隐蔽性&#xff1a;一般隐藏的会比较深&#xff0c;目的就是为了防止…

学生护眼台灯哪个牌子实用?值得入手的学生护眼台灯十大排名分析

在这个数码时代&#xff0c;人们对屏幕的依赖程度越来越高&#xff0c;尤其是孩子们。他们不仅在学校里需要长时间盯着教科书&#xff0c;还会在学习和娱乐中使用各种数码设备。然而&#xff0c;这也使得眼睛健康问题逐渐凸显&#xff0c;尤其是儿童近视的问题。为了保护视力&a…

重庆交通大学数学与统计学院携手泰迪智能科技共建的“智能工作室”

2024年7月4日&#xff0c;重庆交通大学数学与统计学院与广东泰迪智能科技股份有限公司携手共建的“智能工作室”授牌仪式在南岸校区阳光会议室举行。此举标志着数统学院与广东泰迪公司校企合作新篇章的开启&#xff0c;也预示着学院在智能科技教育领域的深入探索和实践。 广东…

利用Python进行数据分析PDF下载经典数据分享推荐

本书由Python pandas项目创始人Wes McKinney亲笔撰写&#xff0c;详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python 3.6进行全面修订和更新&#xff0c;涵盖新版的pandas、NumPy、IPython和Jupyter&#xff0c;并增加大量实际案例…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

本篇大纲 前言一. 引用续讲1. 传值,传引用效率对比2. 类型转换和表达式传引用的注意事项3. 引用与指针 二. 内联函数1. 概念2. 特性3. 面试题 三. auto关键字(C11)1. 类型别名思考2. auto简介3. auto的使用细则4. auto不能推导的场景 四. 基于范围的for循环(C11)1. 范围for的语…

运维系列.Nginx:自定义错误页面

运维系列 Nginx&#xff1a;自定义错误页面 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…

医院人员管理项目01_下午,css

文章目录 层叠样式表在html文件中引入css样式表&#xff1a;2种方法如何设置样式&#xff1a;3种css选择器继承权重 层叠样式表 引入html网页中的方式&#xff0c;共3种。 行内样式&#xff08;内联样式&#xff09;&#xff1a;直接在html中设置 内部样式&#xff1a;css代…

latex改写字体和字号

文章目录 字体使用宏包设置命令声明命令 字号例子设置特定字号 设置行间距用\setlength{\baselineskip}{24pt}设置\renewcommand{\baselinestretch}{2} \selectfont中文行距&#xff08;{ctex}&#xff09; 补充&#xff1a; 字体 使用宏包 \usepackage{ctex}设置命令 只对确…

【包邮送书】AIGC时代程序员的跃迁——编程高手的密码武器

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

20240708 Transformer

如何从浅入深理解transformer&#xff1f; - 知乎 1.出现了一些基于自监督的方法&#xff0c;这包括基于对比学习的方法如MoCo和SimCLR&#xff0c;和基于图像掩码的方法如MAE和BeiT 2、Transformer结构及其应用详解--GPT、BERT、MT-DNN、GPT-2 - 知乎 3. "Decoder-o…

掌握【Python异常处理】:打造健壮代码的现代编程指南

目录 ​编辑 1. 什么是异常&#xff1f; 知识点 示例 小李的理解 2. 常见的内置异常类型 知识点 示例 小李的理解 3. 异常机制的意义 知识点 示例 小李的理解 4. 如何处理异常 知识点 示例 小李的理解 5. 抛出异常 知识点 示例 小李的理解 6. Python内置…

从0到1搭建个性化推送引擎:百数教学带你掌握核心技术

百数低代码的推送提醒功能允许用户高度自定义提醒规则&#xff0c;支持多种提醒方式&#xff08;如钉钉、企业微信、微信、短信、语音、邮件等&#xff09;&#xff0c;以满足不同场景下的需求。 通过预设字段和模板&#xff0c;用户可以快速编辑提醒内容&#xff0c;减少重复…

ubuntu24.04按关键字卸载不需要的apt包

使用的时候发现一个imagemagic无法正常读取文件&#xff0c;试图卸载 man apt经过尝试后&#xff0c;发现list的一个神奇关键字&#xff0c;用来显示已安装的软件包 sudo apt list --installed | grep image按image关键字过滤&#xff1a; 之后按软件名卸载即可 sudo apt pu…

【VUE基础】VUE3第一节—vite创建vue3工程

什么是VUE Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0…

MySQL性能优化 一、系统配置优化

数据库优化纬度有四个&#xff1a; 硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择&#xff1a; 优化成本&#xff1a;硬件升级 > 系统配置 > 表结构设计 > SQL语句及索引优化效果&#xff1a;硬件升级 < 系统配置 < 标结果设计 < SQL语句及索…

【C++】———— 继承

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月5日 一、什么是继承&#xff1f; 继承的概念 定义&#xff1a; 继承机制就是面向对象设计中使代码可以复用的重要手段&#xff0c;它允许在程序员保持原有类特性的基础上进行扩展…