回溯模板384751

Posted 保护眼睛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯模板384751相关的知识,希望对你有一定的参考价值。

回溯模板

private void backtrack("原始参数") {
    //终止条件(递归必须要有终止条件)
    if ("终止条件") {
        //一些逻辑操作(可有可无,视情况而定)
        return;
    }
    for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {
        //一些逻辑操作(可有可无,视情况而定)

        //做出选择

        //递归
        backtrack("新的参数");
        //一些逻辑操作(可有可无,视情况而定)

        //撤销选择
    }
}

剑指 Offer 38. 字符串的排列

class Solution38 {
    public static String[] permutation(String s) {
        Set<String> res = new HashSet<>();
        backtrack(s.toCharArray(), "", new boolean[s.length()], res);

        return res.toArray(new String[res.size()]);
    }

    private static void backtrack(char[] chars, String curString, boolean[] visited, Set<String> res) {
        //边界条件判断,当选择的字符长度等于原字符串长度的时候,说明原字符串的字符都已经选完了
        if (curString.length() == chars.length) {
            res.add(curString);
            return;
        }
        for (int i = 0; i < chars.length; i++) {
            //已经选择过的就不能再选了
            if (visited[i])
                continue;
            //表示选择当前字符
            visited[i] = true;
            //把当前字符选择后,到树的下一层继续选
            backtrack(chars, curString + chars[i], visited, res);
            //递归往回走的时候要撤销选择
            visited[i] = false;
        }
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(permutation("abc")));
    }
}

剑指 Offer 47. 礼物的最大价值

class Solution47 {
    public static int maxValue(int[][] grid) {
        int row = grid.length;
        int col = grid[0].length;

        for (int i = 1; i < col; i++) {
            grid[0][i] = grid[0][i - 1] + grid[0][i];
        }
        for (int i = 1; i < row; i++) {
            grid[i][0] = grid[i - 1][0] + grid[i][0];
        }
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                grid[i][j] = Math.max(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
            }
        }

        return grid[row - 1][col - 1];
    }

    public static void main(String[] args) {
        System.out.println(maxValue(new int[][]  {{1,3,1},{1,5,1},{4,2,1}}));
    }
}

剑指 Offer 51. 数组中的逆序对

class Solution51 {
    static int count = 0;

    public static int reversePairs(int[] nums) {
        mergerSort(nums);

        return count;
    }

    public static void mergerSort(int[] array) {
        mergerSortRec(array, 0, array.length - 1);
    }

    public static void mergerSortRec(int[] array, int low, int high) {
        if (low >= high) return;

        int mid = (high - low) / 2 + low;

        mergerSortRec(array, low, mid);
        mergerSortRec(array, mid + 1, high);
        merger(array, low, mid, high);
    }

    private static void merger(int[] array, int low, int mid, int high) {
        int[] tmp = new int[high - low + 1];
        int k = 0;
        int s1 = low;
        int e1 = mid;
        int s2 = mid + 1;
        int e2 = high;

        while (s1 <= e1 && s2 <= e2) {
            if (array[s1] <= array[s2]) {
                tmp[k++] = array[s1++];
            } else {
                count += (mid - s1 + 1);
                tmp[k++] = array[s2++];
            }
        }

        while (s1 <= e1) {
            tmp[k++] = array[s1++];
        }

        while (s2 <= e2) {
            tmp[k++] = array[s2++];
        }

        for (int i = 0; i < tmp.length; i++) {
            array[low + i] = tmp[i];
        }
    }

    public static void main(String[] args) {
        int[] array = {1, 3, 2, 3, 1};

        System.out.println(reversePairs(array));

//        System.out.println(Arrays.toString(array));
    }
}

以上是关于回溯模板384751的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

算法漫游指北(第十篇):泛型递归递归代码模板递归思维要点分治算法回溯算法

Eclipse 中的通用代码片段或模板