LeetCode回溯算法

1. leetcode 77组合

//给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

模板一,利用used数组

List<List<Integer>> ans = new LinkedList<>();

        public List<List<Integer>> combine(int n, int k) {

            backTrace(n, k, 0,  new LinkedList<>(), new boolean[n + 1]);
            return ans;

        }

        private void backTrace(int n, int k,  int count, LinkedList<Integer> tmp, boolean[] used) {
            if (count == k) {
                ans.add(new LinkedList(tmp));
                return;
            }
            for (int i = 1; i <= n; i++) {
                if (!used[i]) {
                    used[i] = true;
                    tmp.addLast(i);
                    backTrace(i, k,  count + 1, tmp, used);
                    tmp.pollLast();
                    used[i] = false;
                }

            }
        }

模板2:不利用used数组,利用下标。

List<List<Integer>> ans = new LinkedList<>();

        public List<List<Integer>> combine(int n, int k) {

            backTrace(n, k, 0, 1, new LinkedList<>());
            return ans;

        }

        private void backTrace(int n, int k, int count, int start, LinkedList<Integer> tmp) {
            if (count == k) {
                ans.add(new LinkedList(tmp));
                return;
            }
            for (int i = start; i <= n; i++) {
                tmp.addLast(i);
                backTrace(n, k, count + 1, i + 1, tmp);
                tmp.pollLast();
            }

        }
上一篇:Python装饰器真心好用


下一篇:2021-04-15