2021.11.24 - SX08-02.组合

1. 题目

在这里插入图片描述

2. 思路

(1) 回溯法

  • 首先将问题转换成在一棵树上进行深度优先搜素,如下图所示:

在这里插入图片描述

  • 可以定义一个全局栈,用于存储根结点到叶子结点的路径,当遍历到叶子结点时,将栈中的路径记录到结果集中,返回后弹出栈顶元素,相当于回溯,然后通过for循环遍历下一个叶子结点,直到遍历完所有路径。
  • 可以通过设置剪枝策略大幅提高搜索效率,以n=4,k=2为例,在最上面一层for循环中,遍历1、2、3即可,无需遍历4,因为必然不满足k=2的要求。
  • 如果循环结束的条件需要计算,可以反转循环方向,这样只需计算一次循环条件,可以提高效率。

3. 代码

import java.util.*;

public class Test {
    
    
    public static void main(String[] args) {
    
    
    }
}

class Solution {
    
    
    private int n;
    private int k;
    private Deque<Integer> stack;
    private List<List<Integer>> res;

    public List<List<Integer>> combine(int n, int k) {
    
    
        this.n = n;
        this.k = k;
        stack = new LinkedList<>();
        res = new ArrayList<>();
        backtrack(1);
        return res;
    }

    private void backtrack(int index) {
    
    
        if (stack.size() == k) {
    
    
            res.add(new ArrayList<>(stack));
            return;
        }
        for (int i = n - k + 1 + stack.size(); i >= index; i--) {
    
    
            stack.push(i);
            backtrack(i + 1);
            stack.pop();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44021223/article/details/121519003
sx
今日推荐