栈,递归,回溯理解

47 阅读1分钟

1.栈

判断括号匹配是否正确

    public static boolean isValid(String s){
        final String left="([{";
        final String right=")]}";
        Stack<Character> stk=new Stack<>();
        for (int i = 0; i <s.length(); i++) {
            char c = s.charAt(i);
            if(left.indexOf(c)!=-1){
                stk.push(c);
            }else{
                if(!stk.isEmpty() && stk.peek()==left.charAt(right.indexOf(c)))
                    stk.pop();
                else
                    return false;
            }
        }
        return stk.empty();
    }

2.递归

    function fn(n){
    if(n==1){
        return 1
    }
    return n*fn(n-1)
}

// fn(3){
//    return 3*fn(2){
//        return 2*fn(1)
//     }
// }

3.回溯

    //求子集回溯算法
    public static List<List<Integer>> subsets(int[] nums){
        List<List<Integer>> result=new ArrayList<>();
        if(nums==null||nums.length==0){
            return result;
        }
      
        backtrack(result,new ArrayList<>(),nums,0);
        return  result;
    }
    //list 结果
    //current 当前路径
    //nums 数据源
    //start 开始索引位置
    private static void backtrack(List<List<Integer>> list,
                                  List<Integer> current,
                                  int[] nums,
                                  int start) {
        list.add(new ArrayList<>(current));
        //水平方向选择
        for (int i = start; i <nums.length ; i++) {
            //递的过程
            current.add(nums[i]);
            //垂直方向递归选择
            backtrack(list,current,nums,i+1);
            //归的过程
            current.remove(current.size()-1);
        }
    }