分治法(LC241 和 LC95)

  LC241和LC95使用分治法,这两个题比较有套路,之后有分治法,可以参考参考这个套路来进行。

  LC241:

class Solution {
    public List<Integer> diffWaysToCompute(String expression) {
        int n = expression.length();
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < n; i++) {
            char c = expression.charAt(i);
            if(c == '+' || c == '-' || c == '*') {
                List<Integer> left = diffWaysToCompute(expression.substring(0, i));
                List<Integer> right = diffWaysToCompute(expression.substring(i+1));
                for(int l: left) {
                    for(int r: right) {
                        switch(c) {
                            case '+':
                                list.add(l + r);
                                break;
                            case '-':
                                list.add(l - r);
                                break;
                            case '*':
                                list.add(l * r);
                                break;
                        }
                    }
                }
            }
        }
        if(list.size() == 0) {
            list.add(Integer.valueOf(expression));
        }
        return list;
    }
}

 

  LC95

/**
 * 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 List<TreeNode> generateTrees(int n) {
        if(n < 1) return new LinkedList<TreeNode>();
        return generateSubTrees(1, n);
    }

    List<TreeNode> generateSubTrees(int l, int r) {
        List<TreeNode> list = new LinkedList<>();

        if(l > r) {
            list.add(null);
            return list;
        }

        for(int i = l; i <=r; i++) {
            List<TreeNode> leftTree = generateSubTrees(l, i -1);
            List<TreeNode> rightTree = generateSubTrees(i + 1, r);
            for(TreeNode left : leftTree) {
                for(TreeNode right : rightTree) {
                    TreeNode cur = new TreeNode(i);
                    cur.left = left;
                    cur.right = right;
                    list.add(cur);
                }
            }
        }
        return list;
    }
}

 

posted @ 2022-04-27 11:01  小白的学习  阅读(60)  评论(0)    收藏  举报