【备战字节面试】算法特训-回溯算法

127 阅读1分钟

简单粗暴,记录备战过程,持续更新

回溯算法

适用场景

实战

实战1  51. N 皇后

实战2 46. 全排列

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> ansList = new ArrayList<>();
        int[] used = new int[nums.length];
        Arrays.fill(used,0);
        find(ansList, nums, used, 0, new ArrayList<Integer>());
        return ansList;
    }

    private void find( List<List<Integer>> list , int[] nums , int[] used , int deepth, List<Integer> tmp){
        if(deepth == nums.length){
            list.add(new ArrayList<>(tmp));
            return;
        }
        for(int i = 0 ; i < used.length ; i++ ){
            // 未使用
            if(used[i] != 1){
                tmp.add(nums[i]);
                used[i] = 1;
                find(list, nums, used, deepth+1, tmp);
                used[i] = 0;
                tmp.remove(tmp.size() -1);
            }
        }
    }
}

实战3 22. 括号生成

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<>();
        int open = 0, close = 0 ;
        StringBuilder sb = new StringBuilder();
        doGenerateParenthesis(list,open,close,n,sb);
        return list;
    }

    private void doGenerateParenthesis(List<String> list, int open, int close, int max, StringBuilder sb){
        // 临界点
        if(sb.length() == (max*2)){
            list.add(sb.toString());
            return;
        }

        if(open < max){
            sb.append("(");
            doGenerateParenthesis(list,open + 1,close,max,sb);
            sb.deleteCharAt(sb.length() - 1);
        }
        if(close < open){
            sb.append(")");
            doGenerateParenthesis(list,open,close + 1,max,sb);
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}

实战4 78. 子集

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        doSubsets(nums, ans, 0, new ArrayList<>());

        return ans;
    }

    private void doSubsets(int[] nums, List<List<Integer>> ans, int idx, List<Integer> tmp){
        ans.add(new ArrayList<>(tmp));
        for(int i = idx ; i < nums.length ; i++){
            
            tmp.add(nums[i]);
            doSubsets(nums, ans, i+1, tmp);
            tmp.remove(tmp.size() -1);
        }
    }
}