分治法小结

这类的题真的不多,放两个典型的感受一下。

241. 为运算表达式设计优先级

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;
        }
    }
}

 95. 不同的二叉搜索树 II

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;
    }
}

96. 不同的二叉搜索树

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实现

posted @ 2019-12-02 13:28  卑微芒果  Views(187)  Comments(0Edit  收藏  举报