hot100(9)

81.104. 二叉树的最大深度 - 力扣(LeetCode)

后序遍历,从下往上,需要用到下面返回的结果。

public int maxDepth(TreeNode root) {if(root == null){return 0;}int left = maxDepth(root.left);int right = maxDepth(root.right);return Math.max(left,right) + 1;}

82.102. 二叉树的层序遍历 - 力扣(LeetCode)

层序遍历,队列

List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {if(root == null) return res;level(root);return res;}public void level(TreeNode root){Deque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);while(!queue.isEmpty()){int len = queue.size();List<Integer> list = new ArrayList<>();for(int i = 0 ; i < len ; i++){TreeNode node = queue.poll();list.add(node.val);if(node.left != null){queue.offer(node.left);}if(node.right != null){queue.offer(node.right);}}res.add(list);}}

83.101. 对称二叉树 - 力扣(LeetCode)

树形结构,且判断子树是否对称 与 判断原二叉树是否对称 是相同的问题,子问题与原文题具有相同的结构,考虑递归。

public boolean isSymmetric(TreeNode root) {return isSymmetricHelper(root.left,root.right);}public boolean isSymmetricHelper(TreeNode p,TreeNode q){if(p == null || q == null){return p == q;}return p.val == q.val && isSymmetricHelper(p.left,q.right) && isSymmetricHelper(p.right,q.left);}

84.98. 验证二叉搜索树 - 力扣(LeetCode)

中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

TreeNode preNode;public boolean isValidBST(TreeNode root) {if(root == null) return true;boolean left = isValidBST(root.left);if(preNode != null && preNode.val >= root.val) return false;preNode = root;boolean right = isValidBST(root.right);return left && right;}

85.96. 不同的二叉搜索树 - 力扣(LeetCode)

题解:代码随想录_不同的二叉搜索树

1.dp数组及下标含义

dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]个

或者i个不同元素的节点组成的二叉搜索树的数量为dp[i]个

2.确定递推公式

dp[i] += dp[以j为头节点左子树节点数量]*dp[以j为头节点右子树节点数量]

j相当于是头节点的元素,从1遍历到i为止

dp[i] += dp[j-1]*dp[i-j]

3.初始化

dp[0] = 1;

从定义上来讲,空节点也是一颗二叉树,也是一科二叉搜索树,可以说得通。

同时为了满足递推公式的乘法,避免结果都为0,dp[0]需要初始化为1

4.遍历顺序

i从大到小,遍历i里每一个数作为头节点的状态,用j来遍历

5.举例推导dp数组

public int numTrees(int n) {int[] dp = new int[n+1];dp[0] = 1;for(int i = 1 ; i <= n; i++){for(int j = 1 ; j <= i ; j++){dp[i] += (dp[j-1] * dp[i-j]);}}return dp[n];}

86.94. 二叉树的中序遍历 - 力扣(LeetCode)

List<Integer> res = new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {inOrder(root);return res;}public void inOrder(TreeNode root){if(root == null){return;}inOrder(root.left);res.add(root.val);inOrder(root.right);}

87.85. 最大矩形 - 力扣(LeetCode)

题解:85.最大矩形题解 - 力扣

I暴力优化

class Solution {public int maximalRectangle(char[][] matrix) {int m = matrix.length;if (m == 0) {return 0;}int n = matrix[0].length;int[][] left = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == '1') {left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;}}}int ret = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == '0') {continue;}int width = left[i][j];int area = width;for (int k = i - 1; k >= 0; k--) {width = Math.min(width, left[k][j]);area = Math.max(area, (i - k + 1) * width);}ret = Math.max(ret, area);}}return ret;}
}

单调栈

public int maximalRectangle(char[][] matrix) {int m = matrix.length;if(m == 0){return 0;}int n = matrix[0].length;int[][] left = new int[m][n];for(int i = 0 ; i < m ; i++){for(int j = 0 ; j < n ; j++){if(matrix[i][j] == '1'){left[i][j] = (j == 0 ? 0 : left[i][j-1]) + 1;}}}int res = 0;for(int j = 0 ; j < n ; j++){int[] up = new int[m];int[] down = new int[m];Deque<Integer> stack = new ArrayDeque<>();for(int i = 0 ; i < m;  i++){while(!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]){stack.pop();}if(stack.isEmpty()){up[i] = -1;}else{up[i] = stack.peek();}stack.push(i);}stack.clear();for(int i = m - 1 ; i >= 0 ; i--){while(!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]){stack.pop();}if(stack.isEmpty()){down[i] = m;}else{down[i] = stack.peek();}stack.push(i);}for(int i = 0 ; i < m ; i++){int height = down[i] - up[i] - 1;int area = height * left[i][j];res = Math.max(area,res);}}return res;}

88.84. 柱状图中最大的矩形 - 力扣(LeetCode)

单调栈

public int largestRectangleArea(int[] heights) {int[] left = new int[heights.length];int[] right = new int[heights.length];int res = 0;Deque<Integer> stack = new ArrayDeque<>();for(int i = 0 ; i < heights.length ; i++){while(!stack.isEmpty() && heights[stack.peek()] >= heights[i]){stack.pop();}left[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(i);}stack.clear();for(int i = heights.length - 1 ; i >= 0 ; i--){while(!stack.isEmpty() && heights[stack.peek()] >= heights[i]){stack.pop();}right[i] = stack.isEmpty() ? heights.length : stack.peek();stack.push(i);}for(int i = 0 ; i < heights.length ; i++){res = Math.max((right[i] - left[i] - 1)*heights[i],res);}return res;}

每个元素至多进出栈一次

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

单调栈+常数优化

public int largestRectangleArea(int[] heights) {int[] left = new int[heights.length];int[] right = new int[heights.length];Arrays.fill(left,-1);Arrays.fill(right,heights.length);int res = 0;Deque<Integer> stack = new ArrayDeque<>();for(int i = 0 ; i < heights.length ; i++){while(!stack.isEmpty() && heights[stack.peek()] >= heights[i]){right[stack.peek()] = i;stack.pop();}left[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(i);}for(int i = 0 ; i < heights.length ; i++){res = Math.max((right[i] - left[i] - 1)*heights[i],res);}return res;}

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

89.1. 两数之和 - 力扣(LeetCode)

哈希思想,空间换时间

public int[] twoSum(int[] nums, int target) {int[] res = new int[2];Map<Integer,Integer> map = new HashMap<>();for(int i = 0 ; i < nums.length ; i++){int match = target - nums[i];if(map.containsKey(match)){res[0] = map.get(match);res[1] = i;return res;}map.put(nums[i],i);}return res;}

90.78. 子集 - 力扣(LeetCode)

回溯问题

List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int[] nums;public List<List<Integer>> subsets(int[] nums) {this.nums = nums;dfs(0);return res;}public void dfs(int index){res.add(new ArrayList<>(path));if(index == nums.length){return ;}for(int i = index ; i < nums.length ; i++){path.add(nums[i]);dfs(i+1);path.remove(path.size() - 1);}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…

U9成品入库单有提示 组织+单号已经存在

2025年首个问题出来了&#xff01;也是U9上线以来首次碰到的问题。看到这样的提示&#xff0c;头皮发麻了。深感不妙。看过all.log之后&#xff0c;果然是重复行的问题&#xff01; 怎么会有重复行的错误发生呢&#xff1f;百思不得其解。 无奈之下&#xff0c;只能将单据类型…

为什么要设计DTO类/什么时候设置DTO类?

为什么设计DTO类&#xff1f; 例如&#xff1a;根据新增员工接口设计对应的DTO 前端传递参数列表&#xff1a; 思考&#xff1a;是否可以使用对应的实体类来接收呢&#xff1f; 注意&#xff1a;前端提交的数据和实体类中对应的属性差别比较大&#xff0c;所以自定义DTO类。 …

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…

大语言模型遇上自动驾驶:AsyncDriver如何巧妙解决推理瓶颈?

导读 这篇论文提出了AsyncDriver框架&#xff0c;致力于解决大语言模型在自动驾驶领域应用中的关键挑战。论文的主要创新点在于提出了大语言模型和实时规划器的异步推理机制&#xff0c;实现了在保持性能的同时显著降低计算开销。通过设计场景关联指令特征提取模块和自适应注入…

【iOS自动化】Xcode配置WebDriverAgent

WebDriverAgent 是 iOS 端自动化测试的工具&#xff0c;这里记录下 MacOS 环境 Xcode 如何配置 WebDriverAgent。 【重要】环境准备 ‼️ 注意&#xff1a;Xcode 版本需要支持对应的 iOS 版本&#xff0c;而 Xcode 版本又依赖 MacOS 版本&#xff1b;在开始部署前&#xff0c…

洛谷题目: P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 (本题较简)

题目传送门&#xff1a; P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 这是一道关于概率和期望的动态规划问题&#xff0c;解题的核心思路是通过建立状态转移方程来计算甲壳虫从树根爬到树顶所需时间的期望值。题…

力扣题库第495题目解析

文章目录 1.题目再现2.思路分析&&示例说明2.1第一个示例2.2第二个示例 3.代码解释 1.题目再现 这个题目的名字叫做提莫攻击&#xff0c;如果是玩游戏的小伙伴对于这个场景就很熟悉了&#xff1b; 这个实际上是说&#xff1a;已知的条件会给我们一个数组&#xff0c;在…

leetcode刷题日记 1

https://leetcode.cn/problems/decode-ways/description/ 题目分析 分析了一下题目&#xff0c;我的第一想法&#xff1a;和之前的上楼梯问题很像 为什么这么说呢&#xff0c;感觉他们的值和他们之前元素都有千丝万缕的联系 就像上楼梯问题 就是我们的dp问题 怎么解释呢&a…

matlab simulink 汽车四分之一模型轮胎带阻尼

1、内容简介 略 matlab simulink121-汽车四分之一模型轮胎带阻尼 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言&#xff1a;当算法遇见迷宫 想象你置身于一个复杂的迷宫&#xff0c;如何在最短时间内找到出口&#xff1f;这个问题不仅存在于童话故事中&#xff0c;更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题&#xff0c;深入理解广度优先搜索&#xff08;BFS&am…

网工_以太网MAC层

2025.02.05&#xff1a;网工老姜学习笔记 第12节 以太网MAC层 2.1 MAC层的硬件地址2.2 MAC地址特殊位含义2.3 终端适配器&#xff08;网卡&#xff09;具有过滤功能2.4 MAC帧的格式2.4.1 DIX Ethernet V2标准&#xff08;先私有&#xff0c;后开放&#xff0c;用得比较多&#…

解锁高效 Web 开发新姿势:Open WebUI 安装指南

在 Web 开发的浩瀚宇宙里&#xff0c;找到一款强大又好用的框架&#xff0c;就如同拥有了超级外挂&#xff0c;能让开发效率直线飙升。 今天要给大家介绍的 Open WebUI&#xff0c;便是这样一款神器&#xff0c;它作为开源框架&#xff0c;助力开发者轻松搭建现代感十足、交互性…

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…

软考高级-软件系统架构师-02-软件工程(重点)

用工程化的思想做软件 一、软件开发方法&#xff08;/原则&#xff09; 软件开发方法&#xff08;重点&#xff09; 结构化法&#xff08;面向过程/函数&#xff09; C 概念 用户至上严格区分工作阶段&#xff0c;每个阶段有各自的任务和成果强调系统开发的整体性和全局性系统开…

STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…

甘肃省医保刷脸设备激活步骤

医保刷脸设备激活开通操作流程 激活社保 一、拆下刷脸设备&#xff0c;按右侧按键设置Wi-Fi和内网 Wi-Fi可连接个人热点&#xff0c;用于获取安装地址 配置Wi-Fi成功以后&#xff0c;输入机构代码&#xff0c;点击“获取”&#xff0c;安装地址获取成功&#xff1b; 断开Wi-…

一个sql只能有一个order by

ORDER BY 子句在 SQL 中只能出现一次&#xff0c;静态部分和动态部分只能写一个 ORDER BY

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 进程组 进程组的概念 当我们使用以下命令查与…

MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知&#xff0c;Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的&#xff0c;下面将主要…