题解 | JAVA 递归回溯#加起来和为目标值的组合(三)# K-sum [P1]

加起来和为目标值的组合(三)

http://www.nowcoder.com/practice/8c297161a58740c5b92b3e184dd1756e

K-sum 跟这道题 一样的思路,递归回溯的暴力枚举。
唯一不同的就是basecase(i.e. 已经用了k个数时)检查下和是否为n.

时间: O(n^k)
空间: O(k) 栈最高为k。因为用了回溯,栈上每层都是const space.

import java.util.*;

public class Solution {
    ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
  
    public int[][] combination (int k, int n) {
      recurse(0 /* last */, k, n, new ArrayList<>());
      int[][] _ans = new int[ans.size()][];
      
      // convert to int[][]. java是真蛋疼
      for (int i = 0; i < ans.size(); i++) {
        _ans[i] = ans.get(i).stream().mapToInt(x->x).toArray();
      }
      return _ans;
    }
  
    public void recurse(int last, int k, int n, ArrayList<Integer> partial) {
      if (n == 0 && k == 0) {  // found a solution
        ans.add(new ArrayList<>(partial));
        return;
      } else if (n <= 0 || k == 0) // not a solution
        return;
      
      for (int i = last+1; i <= 9; i++) {
        partial.add(i);
        recurse(i, k-1, n-i, partial);
        partial.remove(partial.size()-1);  // 回溯
      }
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务