【力扣算法简单五十题】17.路径总和

本文探讨了一种算法问题,即给定一个二叉树和一个目标整数,判断是否存在从根节点到叶子节点的路径,使得路径上所有节点值之和等于目标整数。文章通过具体示例说明了如何解决这一问题。

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:
在这里插入图片描述
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:
在这里插入图片描述
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:
树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000

在准备前端面试时,尤其是针对算法目,力扣LeetCode)是一个非常重要的资源。以下是一些前端面试中常考的算法目类型及具体示例,涵盖基础数据结构、排序、搜索、动态规划等多个方面。 ### 常见算法型分类 #### 1. 数组与字符串操作 - **两数之和(Two Sum)**:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 - **最长公共前缀(Longest Common Prefix)**:找出字符串数组中的最长公共前缀。 - **三数之和(3Sum)**:找出数组中所有满足和为零的三元组。 - **盛最多水的容器(Container With Most Water)**:给定 n 个非负整数,每个数对应坐标上的高度,找出两条线使得它们与 x 轴共同构成的容器可以容纳最多的水 [^2]。 #### 2. 排序与查找 - **合并两个有序数组(Merge Sorted Array)**:将两个有序数组合并为一个有序数组。 - **搜索旋转排序数组(Search in Rotated Sorted Array)**:在一个旋转后的有序数组中查找目标值。 - **寻找重复数(Find the Duplicate Number)**:在长度为 n + 1 的数组中找出唯一重复的那个数字。 #### 3. 递归与回溯 - **子集(Subsets)**:返回一个数组的所有子集 [^1]。 - **全排列(Permutations)**:返回一个数组的所有全排列。 - **组合总和(Combination Sum)**:找出所有和为目标值的组合。 - **N皇后(N-Queens)**:在 N×N 棋盘上放置 N 个皇后,使得它们互不攻击。 #### 4. 动态规划 - **最大子序和(Maximum Subarray)**:找出一个连续子数组使其和最大。 - **爬楼梯(Climbing Stairs)**:每次可以爬 1 或 2 阶楼梯,问有多少种不同的方法到达楼顶。 - **不同路径(Unique Paths)**:机器人从左上角到右下角有多少种不同的路径。 - **编辑距离(Edit Distance)**:计算两个字符串之间的最小编辑操作次数。 #### 5. 树与图 - **二叉树的前序、中序、后序遍历(Binary Tree Traversal)**:实现递归与非递归版本。 - **验证二叉搜索树(Validate Binary Search Tree)**:判断一棵树是否是二叉搜索树。 - **二叉树的最大深度(Maximum Depth of Binary Tree)**:求二叉树的最大深度。 - **岛屿数量(Number of Islands)**:在一个二维网格中,'1' 表示陆地,'0' 表示水域,求岛屿的数量。 #### 6. 其他高频型 - **有效的括号(Valid Parentheses)**:判断括号字符串是否合法。 - **环形链表(Linked List Cycle)**:判断链表中是否有环。 - **LRU 缓存机制(LRU Cache)**:设计一个支持 get 和 put 操作的最近最少使用缓存。 - **接雨水(Trapping Rain Water)**:计算可以接多少单位的雨水 [^2]。 ### 示例代码:子集生成 ```javascript var subsets = function(nums) { let n = 1 << nums.length; let res = []; for(let i = 0; i < n; i++) { let temp = []; for(let j = 0; j < nums.length; j++) { if(i & (1 << j)) { temp.push(nums[j]); } } res.push(temp); } return res; }; ``` ### 示例代码:全排列 ```javascript function permute(nums) { const result = []; const used = new Array(nums.length).fill(false); function dfs(path) { if (path.length === nums.length) { result.push([...path]); return; } for (let i = 0; i < nums.length; i++) { if (used[i]) continue; used[i] = true; path.push(nums[i]); dfs(path); path.pop(); used[i] = false; } } dfs([]); return result; } ``` ### 总结 在准备前端面试时,算法的核心在于理解问本质、掌握常见解思路、熟悉常用数据结构,并能灵活运用递归、回溯、动态规划等技巧。力扣上的上述目是高频考点,建议反复练习并尝试多种解法。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值