【力扣hot100题】(049)二叉树中的最大路径和

递归,新建递归函数返回是根节点的最大向下路径值,每次递归可以通过左右的递归值判断当前节点要不要连接左右节点,由此更新result,并且返回当前节点连接左右节点中最大的那个节点(或是选择不连接)的值。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int result=-1001;
    int maxPath(TreeNode* root){
        if(root==nullptr) return 0;
        int l=maxPath(root->left);
        int r=maxPath(root->right);
        if(l>=0&&r>=0) result=max(result,l+r+root->val);
        else if(l>=0) result=max(result,root->val+l);
        else if(r>=0) result=max(result,root->val+r);
        else{
            result=max(result,root->val);
            return root->val;
        }
        return root->val+max(l,r);
    }
    int maxPathSum(TreeNode* root){
        result=max(result,maxPath(root));
        return result;
    }
};

### LeetCode Hot 100 编程问及解决方案概述 LeetCode Hot 100 是一份精选的编程目列表,广泛被用于算法学习面试准备。这些问涵盖了多种数据结构算法类型,包括但不限于数组、链表、字符串、树、图、动态规划等。 #### 常见型与解法 - **两数之 (Two Sum)** 给定一个整数数组 `nums` 一个目标值 `target`,请你在该数组中找出为目标值的那两个整数,并返回它们的数组下标。 解决方案可以使用哈希表来实现 $O(n)$ 的时间复杂度: ```cpp vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> map; for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; if (map.find(complement) != map.end()) { return {map[complement], i}; } map[nums[i]] = i; } return {}; } ``` - **最长有效括号 (Longest Valid Parentheses)** 给定一个只包含字符 `'('` `')'` 的字符串,计算其中有效括号子串的最大长度。 可以使用栈或动态规划的方法来解决此问。例如,使用栈的方式可以遍历字符串并维护栈中的索引,从而找到最长的有效括号序列 [^1]。 - **搜索旋转排序数组 (Search in Rotated Sorted Array)** 假设按照升序排序的数组在某个关键点上进行了旋转(例如 `[0,1,2,4,5,6,7]` 变成了 `[4,5,6,0,1,2]`),给定一个目标值,请判断是否存在该值。 使用二分查找策略,通过比较中间元素左右边界的值来调整搜索范围。 - **组合总 (Combination Sum)** 给定一个无重复元素的数组 `candidates` 一个目标数 `target`,找出所有满足条件的唯一组合:这些数字的加等于目标值且每个数字可以无限制重复使用。 此问通常使用回溯法解决,递归地尝试所有可能的组合路径。 - **接雨水 (Trapping Rain Water)** 给定一个非负整数数组 `height`,表示一个高程图,计算它可以存储多少单位的雨水。 可以使用双指针方法或者预处理左右最大高度数组来优化计算,确保线性时间复杂度。 #### 数据结构与算法的应用 - **栈** 栈常用于处理括号匹配、表达式求值等问。例如,“字符串解码”可以通过栈来解析嵌套的编码结构 [^2]。 - **排序与双指针** 在“两数之”的变体中,可以利用排序后使用双指针技巧快速定位符合条件的元素对 [^3]。 - **动态规划** 许多 LeetCode Hot 100 目涉及动态规划,如“最大子数组”、“不同路径”、“编辑距离”等。动态规划的核心是定义状态转移方程,并逐步填充 DP 表。 - **滑动窗口** 对于连续子数组相关的问,如“最小覆盖子串”、“无重复字符的最长子串”,滑动窗口是一种高效的解决方案。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值