最小编辑代价&&二叉树根节点到叶子节点的所有路径和&&二叉树根节点到叶子节点和为指定值的路径

183 阅读1分钟

NC35 最小编辑代价

题目链接

1、解题思路

dp的思想,dp【i】【j】表示str1的前i个字符修改为str2的前j个字符的代价。

2、代码
import java.util.*;


public class Solution {
    /**
     * min edit cost
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @param ic int整型 insert cost
     * @param dc int整型 delete cost
     * @param rc int整型 replace cost
     * @return int整型
     */
    public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
        // write code here
        int r = str1.length();
        int c = str2.length();
        int[][] dp = new int[r + 1][c + 1];
        dp[0][0] = 0;
        for (int i = 0; i <= c; i++) {
            dp[0][i] = i * ic;
        }
        for (int i = 0; i <= r; i++) {
            dp[i][0] = i * dc;
        }
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                char s1 = str1.charAt(i - 1);
                char s2 = str2.charAt(j - 1);
                if (s1 == s2) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    int val = Math.min(Math.min(dp[i][j - 1] + ic, dp[i - 1][j] + dc), dp[i - 1][j - 1] + rc);
                    dp[i][j] = val;
                }
            }
        }
        return dp[r][c];
    }
}

NC5 二叉树根节点到叶子节点的所有路径和

题目链接

1、解题思路

dfs的思路吧,到每个节点的时候判断这个结点是不是叶子节点,如果是把当前的值加到结果中。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    private int ans = 0;

    private void levelOrder(TreeNode node, int curVal) {
        if (node.left == null && node.right == null) {
            curVal = curVal * 10 + node.val;
            ans = ans + curVal;
        } else if (node.left != null && node.right != null) {
            levelOrder(node.left, curVal * 10 + node.val);
            levelOrder(node.right, curVal * 10 + node.val);
        } else if (node.left != null) {
            levelOrder(node.left, curVal * 10 + node.val);
        } else {
            levelOrder(node.right, curVal * 10 + node.val);
        }
    }

    public int sumNumbers(TreeNode root) {
        // write code here
        if (root == null) {
            return 0;
        }
        levelOrder(root, 0);
        return ans;
    }
}

NC8 二叉树根节点到叶子节点和为指定值的路径

题目链接

1、解题思路

基本也是dfs的思想,只是需要注意引用问题。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return int整型ArrayList<ArrayList<>>
     */
    private void dfs(TreeNode node, int cur, int sum, ArrayList<ArrayList<Integer>> list, ArrayList<Integer> temp) {
        if (node.left == null && node.right == null) {
            temp.add(node.val);
            cur = cur + node.val;
            if (sum == cur) {
                list.add(temp);
            }
        } else if (node.left != null && node.right != null) {
            ArrayList<Integer> list1 = new ArrayList<>(temp);
            list1.add(node.val);
            dfs(node.left, cur + node.val, sum, list, list1);
            ArrayList<Integer> list2 = new ArrayList<>(temp);
            list2.add(node.val);
            dfs(node.right, cur + node.val, sum, list, list2);
        } else if (node.left != null) {
            ArrayList<Integer> list1 = new ArrayList<>(temp);
            list1.add(node.val);
            dfs(node.left, cur + node.val, sum, list, list1);
        } else if (node.right != null) {
            ArrayList<Integer> list2 = new ArrayList<>(temp);
            list2.add(node.val);
            dfs(node.right, cur + node.val, sum, list, list2);
        }
    }

    public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        ArrayList<Integer> temp = new ArrayList<>();
        dfs(root, 0, sum, list, temp);
        return list;
    }
}