分治法(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; } }

浙公网安备 33010602011771号