力扣 路径总和 III

博客主要介绍了LeetCode中路径总和III的问题,探讨了如何使用递归和前缀和两种方法解决此问题。解法一采用递归方式遍历所有可能的路径,但存在大量重复计算。解法二利用前缀和优化算法,降低时间复杂度。文章还提醒在Java中处理变量传递时要注意基本数据类型的不变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:https://leetcode-cn.com/problems/path-sum-iii/

解题思路:

本题练习递归及其优化。
解法一:对于每个节点,递归的遍历其子节点。(可想而知这样会有大量重复遍历)
解法二:前缀和记录下根节点到正在访问的节点的前缀和,通过前缀和差值求满足条件的个数。复杂度降到O(N)

注意:

要注意传到Java函数中的变量什么时候会改变什么时候不会改变,对于基本数据类型来说,当函数退出,其值一定跟原来是一样的不会改变。

代码:

解法一
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        if(root == null) return 0; 
        int res = 0;
        res = dfs(root, targetSum, root.val, res);
        //System.out.println(res);
        res += pathSum(root.left, targetSum);
        res += pathSum(root.right, targetSum);
        return res;
        
    }
    private static int dfs(TreeNode root, int targetSum, int sum, int res){
    if(root == null) return res;
    //System.out.println(root.val + " " + sum);
    if(sum == targetSum){
        res ++;
        //System.out.println( "fdsdfs " + res);
    }
    if(root.left != null){
         res = dfs(root.left, targetSum, sum + root.left.val, res);
    }
    if(root.right != null){
        res = dfs(root.right, targetSum, sum + root.right.val, res);
    }
    return res;
    }
}
解法二
class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        int res = 0;
        int[] a = new int[1005];
        int tnt = 0;
        res = dfs(root, targetSum, a, tnt, res);
        return res;
    }
    private static int dfs(TreeNode root, int targetSum, int[] a, int tnt, int res){
        if(root == null) return res;
        if(tnt == 0){
           a[tnt] = root.val; 
        } else{
            a[tnt] = a[tnt - 1] + root.val;
        }
          
        for(int i = 0; i < tnt; i ++){
            if((a[tnt] - a[i]) == targetSum){
                res ++;
            }           
        }
        if(a[tnt] == targetSum){
            res ++;
        }
        tnt ++;
        res = dfs(root.left, targetSum, a, tnt, res);
        //tnt --;
        res = dfs(root.right, targetSum, a, tnt, res);
        return res;
    }
}
### 常见的Java LeetCode题目类型及解题思路 #### 题目类型概述 LeetCode上的Java题目涵盖了多种算法和数据结构的应用场景,主要包括数组操作、字符串处理、链表管理、树遍历以及动态规划等问题。以下是几种常见类型的描述: - **数组与矩阵**:涉及查找最大子序列、旋转图像等任务。 - **字符串匹配与编辑距离**:如判断回文串、计算两个字符串之间的最小编辑次数。 - **链表操作**:反转单向/双向链表节点顺序或者检测环形结构的存在与否。 - **二叉树及相关概念**:前序、中序、后序遍历;平衡判定;路径总和求解等等。 #### 示例一:两数之和 (Two Sum) 给定一个整型数组`nums` 和目标值 `target`, 找到数组中的两个不同位置 i,j 的元素使得它们相加等于 target, 返回这两个索引[i,j]. ```java public int[] twoSum(int[] nums, int target){ Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ if(map.containsKey(target - nums[i])){ return new int[]{map.get(target - nums[i]),i}; } map.put(nums[i],i); } throw new IllegalArgumentException("No solution"); } ``` 此方法利用哈希映射来存储已经访问过的数值及其对应的下标,在后续迭代过程中快速定位是否存在满足条件的一对数字[^1]。 #### 示例二:最长公共前缀(Longest Common Prefix) 编写函数找出多个输入字符串列表中最长共有的起始部分。如果不存在这样的共同开头,则返回空字符"". ```java public String longestCommonPrefix(String[] strs) { if(strs==null||strs.length==0)return ""; String prefix=strs[0]; for(int i=1;i<strs.length;i++) { while(strs[i].indexOf(prefix)!=0){ prefix=prefix.substring(0,prefix.length()-1); if(prefix.isEmpty())return ""; } } return prefix; } ``` 通过逐步缩短候选词长度直至找到所有单词都共享的部分作为最终结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值