77. 组合

回溯

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class Solution {

    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> li = new LinkedList<>();

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

        backtracking(n, k, 1);

        return list;
    }

    public void backtracking(int n, int k, int startIndex){

        /**
         * 递归终止条件
         * 如果小集合大小等于k,说明找到了一个满足条件的解
         * 但注意一定不能直接返回li,因为li是引用,在最后一步回溯后会变为空
         */
        if (li.size() == k) {

            list.add(new LinkedList<>(li));
            return;
        }

        /**
         * 递归中传入的起始位置是i + 1而不是startIndex + 1
         * 为了方便删除列表最后一个元素,使用LinkedList
         */
        for (int i = startIndex; i <= n; i++) {

            li.add(i);
            backtracking(n, k, i + 1);
            li.removeLast();
        }
    }
}

/**
 * 时间复杂度 O(((n/k)×k)
 * 空间复杂度 O(k)
 */

优化1——减枝

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class Solution {

    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> li = new LinkedList<>();

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

        backtracking(n, k, 1);

        return list;
    }

    public void backtracking(int n, int k, int startIndex){

        if (li.size() == k) {

            list.add(new LinkedList<>(li));
            return;
        }

        for (int i = startIndex; i <= n - (k - li.size()) + 1; i++) {

            li.add(i);
            backtracking(n, k, i + 1);
            li.removeLast();
        }
    }
}

/**
 * 时间复杂度 O(((n/k)×k)
 * 空间复杂度 O(k)
 */

https://leetcode-cn.com/problems/combinations/

posted @ 2022-01-11 15:18  振袖秋枫问红叶  阅读(41)  评论(0)    收藏  举报