采用回溯算法,在回溯的过程中,使用辅助变量记录总和,并利用组合的长度和总和的值进行剪枝,对满足要求的组合记录在ArrayList res中。

import java.util.*;
public class Solution {
    ArrayList> res = new ArrayList();
    ArrayList track = new ArrayList();
    int sum = 0;
    public int[][] combination (int k, int n) {
        backtrack(1,k,n);
        int[][] resArr = new int[res.size()][k];
        for(int i = 0;i<res.size();i++){
            for(int j = 0;j<k;j++){
                resArr[i][j] = res.get(i).get(j);
            }
        }
        return resArr;
    }
    private void backtrack(int start,int k, int n){
        if(track.size() == k && sum == n){
            res.add(new ArrayList(track));
        }
        if(track.size() > k || sum > n){
            return;
        }
        for(int i = start;i<10;i++){
            sum += i;
            track.add(i);
            backtrack(i+1,k,n);
            sum -= i;
            track.remove(track.size()-1);
        }
    }
}