2021.11.24 - SX08-04.组合总和 III

1. 题目

在这里插入图片描述

2. 思路

(1) 回溯法

  • 利用栈存储路径实现回溯法,重点在于剪枝策略,分别是:
    1. 当和大于n或个数大于k时,直接返回;
    2. for循环的长度以k为限制。

3. 代码

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

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

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

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

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

猜你喜欢

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