https://leetcode.cn/problems/combinations/description/
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

一、回溯

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> part = new ArrayList<>();
        return getCombByPhase(1, n, k, part, ans);
    }

    private List<List<Integer>> getCombByPhase(int start, int n, int k, List<Integer> part, List<List<Integer>> ans) {
        if (k == 0) {
            ans.add(new ArrayList<>(part));
            return ans;
        }
        for (int i = start; i <= n - k + 1; i++) {
            part.add(i);
            getCombByPhase(i + 1, n, k - 1, part, ans);
            part.remove(part.size() - 1);
        }
        return ans;
    }

二、迭代

    private List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> part = new ArrayList<>();
        // init
        for (int i = 0; i < k; i++) {
            part.add(0);
        }
        int i = 0;
        while (i >= 0) {
            part.set(i, part.get(i) + 1);  // 在当前位置+1
            if (part.get(i) > n) { // 越界情况,要回退一位,仅回退i。在循环首行,回退的i被重置
                i--;
            } else if (i == k - 1) { // hit
                ans.add(new ArrayList<>(part));
            } else { // 不足情况,要进一位。在循环首行,进一位的i被在自己位置上+1。所以设置的时候,用当前位的值设置进一位的值即可
                i++;
                part.set(i, part.get(i - 1));
            }
        }
        return ans;
    }

lindsay_bubble
26 声望11 粉丝