算法刷题记录——LeetCode篇(6) [第501~600题](持续更新)

devtools/2025/3/20 2:22:57/

(优先整理热门100及面试150,不定期持续更新,欢迎关注)


543. 二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。

示例 1:

输入:root = [1,2,3,4,5]
输出:3

解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

输入:root = [1,2]
输出:1

提示:

  • 树中节点数目在范围 [1, 10^4] 内
  • -100 <= Node.val <= 100

方法:深度优先搜索(DFS)

利用递归计算每个节点的左右子树深度,在递归过程中更新最大直径。

  1. 递归计算深度:对于每个节点,递归计算其左右子树的深度。
  2. 动态更新直径:在递归过程中,当前节点的直径等于左子树深度与右子树深度之和。通过全局变量 maxDiameter 记录遍历过程中遇到的最大直径。

代码实现(Java)

class Solution {private int maxDiameter = 0;public int diameterOfBinaryTree(TreeNode root) {maxDepth(root);return maxDiameter;}private int maxDepth(TreeNode node) {if (node == null) {return 0;}int leftDepth = maxDepth(node.left);int rightDepth = maxDepth(node.right);// 更新当前最大直径(路径边数为左右深度之和)maxDiameter = Math.max(maxDiameter, leftDepth + rightDepth);// 返回当前节点的深度(左右子树最大深度 + 1)return Math.max(leftDepth, rightDepth) + 1;}
}

方法复杂度分析

  1. 时间复杂度O(n),每个节点被访问一次。
  2. 空间复杂度O(h),递归栈深度与树的高度相关,最坏情况下(树退化为链表)为 O(n)

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

方法一:前缀和 + 哈希表

利用前缀和和哈希表来优化时间复杂度。核心思想是维护一个哈希表,记录每个前缀和出现的次数。遍历数组时,计算当前前缀和,并检查哈希表中是否存在前缀和为 currentSum - k 的键。若存在,则说明存在若干子数组的和为 k。通过这种方式,时间复杂度可降至 O(n)

代码实现(Java)

public class Solution {public int subarraySum(int[] nums, int k) {int count = 0;int currentSum = 0;Map<Integer, Integer> prefixSumMap = new HashMap<>();prefixSumMap.put(0, 1); // 初始前缀和为0出现1次for (int num : nums) {currentSum += num;// 检查是否存在前缀和为 currentSum - kif (prefixSumMap.containsKey(currentSum - k)) {count += prefixSumMap.get(currentSum - k);}// 更新当前前缀和的出现次数prefixSumMap.put(currentSum, prefixSumMap.getOrDefault(currentSum, 0) + 1);}return count;}
}

方法二:暴力枚举

遍历所有可能的子数组起点和终点,计算子数组的和是否为 k。时间复杂度为 O(n²),适用于数据量较小的情况。

代码实现(Java)

public class Solution {public int subarraySum(int[] nums, int k) {int count = 0;for (int i = 0; i < nums.length; i++) {int sum = 0;for (int j = i; j < nums.length; j++) {sum += nums[j];if (sum == k) {count++;}}}return count;}
}

方法三:前缀和数组(暴力枚举优化版)

预先计算前缀和数组,然后遍历所有可能的子数组,通过前缀和之差快速计算子数组和。时间复杂度仍为 O(n²),但减少了重复计算。

代码实现(Java)

public class Solution {public int subarraySum(int[] nums, int k) {int n = nums.length;int[] prefixSum = new int[n + 1];prefixSum[0] = 0;for (int i = 0; i < n; i++) {prefixSum[i + 1] = prefixSum[i] + nums[i];}int count = 0;for (int i = 0; i < n; i++) {for (int j = i + 1; j <= n; j++) {if (prefixSum[j] - prefixSum[i] == k) {count++;}}}return count;}
}

复杂度分析

  1. 前缀和 + 哈希表:通过哈希表记录前缀和的出现次数,将时间复杂度优化至 O(n),是本题的最优解。
  2. 暴力枚举:适用于小规模数据,但时间复杂度为 O(n²),不适用于大规模输入。
  3. 前缀和数组:通过预处理前缀和减少计算量,但时间复杂度仍为 O(n²)

(持续更新,未完待续)


http://www.ppmy.cn/devtools/168504.html

相关文章

爬虫逆向:详细讲述iOS底层原理及机制

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. iOS 系统架构1.1 Core OS 层1.2 Core Services 层1.3 Media 层1.4 Cocoa Touch 层2. iOS 的核心机制2.1 应用生命周期2.2 内存管理2.3 多线程2.4 文件系统2.5 网络通信3. iOS 的启动流程4. iOS 的安全机制4.1 代码签…

LabVIEW烟气速度场实时监测

本项目针对燃煤电站烟气流速实时监测需求&#xff0c;探讨了静电传感器结构与速度场超分辨率重建方法&#xff0c;结合LabVIEW多板卡同步采集与实时处理技术&#xff0c;开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行&#xff0c;提供高…

算法沉淀五:位运算

位运算内容总结 1.基础位运算 << >> ~ &:有0就是0 | :有1就是1 ^:相同为0&#xff0c;相异为1 / 无进位相加 2.给一个数n&#xff0c;确定它的二进制表示中的第x位是0还是1 &上一个1&#xff0c;要么让第x位右移&#xff0c;要么让1左移&#xff0c;一般…

「清华大学、北京大学」DeepSeek 课件PPT专栏

你要的 这里都打包好啦&#xff0c;快快收藏起来&#xff01; 名称 链接 团队简介 类型 DeepSeek——从入门到精通 1️⃣ DeepSeek从入门到精通「清华团队」 清华大学新闻与传播学院 新媒体研究中心 元宇宙文化实验室 PPT课件 DeepSeek如何赋能职场应用? ——从提示语…

2025国际数字能源展全球招商开启,助力数字能源产业新发展

为深入贯彻“四个革命、一个合作”能源安全新战略&#xff0c;服务碳达峰碳中和国家战略&#xff0c;2025国际数字能源展将于9月18 - 21日在深圳会展中心举办&#xff0c;目前全球招商工作已全面启动。 此次展会由深圳市人民政府、中国电力企业联合会等指导&#xff0c;深圳市…

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…

C++ —— 线程同步(互斥锁)

C —— 线程同步&#xff08;互斥锁&#xff09; 线程同步互斥锁&#xff08;互斥量&#xff09;测试代码mutex互斥锁 线程同步 线程同步&#xff1a;多线程协同工作&#xff0c;协商如何使用共享资源。 C11线程同步包含三部分内容&#xff1a; 互斥锁&#xff08;互斥量&…

用通义大模型写爬虫程序,汇总各科成绩

需求&#xff1a;根据各科网址&#xff0c;输入学号、姓名查询成绩。 中间反反复复很多次&#xff0c;本文只记下重点的几次和大模型的沟通历史。 输入界面 查询界面 round0&#xff08;最初的问题&#xff09; 请在windows下&#xff0c;使用python的selenium库&#xff0…