分治法小结
这类的题真的不多,放两个典型的感受一下。
class Solution { public List<Integer> diffWaysToCompute(String input) { List<Integer> list = new LinkedList<>(); if(input==null) return list; if(!input.contains("*")&&!input.contains("+")&&!input.contains("-")) { try{ list.add(Integer.valueOf(input)); }catch(Exception e) { return list; } return list; }else { for(int i = 0; i < input.length(); i++) { if(input.contains("*")||input.contains("-")||input.contains("+")) { for(int left : diffWaysToCompute(input.substring(0,i))) { for(int right : diffWaysToCompute(input.substring(i+1,input.length()))) { if(input.charAt(i)=='*') list.add(left*right); if(input.charAt(i)=='-') list.add(left-right); if(input.charAt(i)=='+') list.add(left+right); } } } } return list; } } }
class Solution { public List<TreeNode> generateTrees(int n) { List<TreeNode> list = new LinkedList<>(); if(n <= 0) return list; return create(1,n); } private List<TreeNode> create(int start, int end) { List<TreeNode> list = new LinkedList<>(); TreeNode head = null; if(start>end) { list.add(null); return list; } for(int k = start; k <= end; k++) { for(TreeNode left : create(start,k-1)) { for(TreeNode right : create(k+1,end)) { head = new TreeNode(k); head.left = left; head.right = right; list.add(head); } } } return list; } }
class Solution { public int numTrees(int n) { if(n<=0) return 0; return f(1,n); } private int f(int l, int r) { if(l >= r) return 1; int count = 0; for(int i = l; i <= r; i++) { count = count + f(l,i-1)*f(i+1,r); } return count; } }
分治法给我的感觉就像是一个西瓜切两半,另外快排和归并排序也是分治法的重要应用务必掌握。排序算法大汇总 Java实现