当前位置:   article > 正文

Leetcode 216 组合总和 III

Leetcode 216 组合总和 III

题意理解

        求数字1-9,任取k个数,其和为n的组合

        每个数字只能用一遍

        这里的求的是组合,即k个值不看顺序。

解题思路:按照回溯法解题模板

        1.确定返回值及参数

                List<>results :记录符合条件的结果

                path:用来记录k个数的组合

                //sum当前path里的值的和

                //startIndex指示之前没用过的数值作为新起点

                void backtracking(n,k,sum,startIndex)

        2.确定终止条件

                当且仅当sum==n时,找到结果,result.add(path) return;

                //此时可以又一个剪枝操作sum>n时,即可剪枝。 return;

        3.单层逻辑

        for(int i=startIndex;i<=9;i++){//这里也可以进行剪枝,当当前startIndex指向的位置不足以取k个数时,剪枝

                i<9-(k-path.size())+1

                path.push(i);

                sum+=i;

                backtracking(n,k,sum,i+1);

                //回溯:

                sum-=i

                path.pop();

        }

1.暴力回溯+三个位置的剪枝

剪枝1:剪掉sum>n的

剪枝2:剪掉path.size组合数>k的

剪枝3:剪掉不足以凑出k个数组合的

  1. List<List<Integer>> results=new ArrayList<>();
  2. LinkedList<Integer> path=new LinkedList<>();
  3. public List<List<Integer>> combinationSum3(int k, int n) {
  4. backtracking(k,n,0,1);
  5. return results;
  6. }
  7. public void backtracking(int k,int n,int sum,int startIndex){
  8. //终止条件
  9. //剪枝1:剪枝值超过n的
  10. if(sum>n) return;
  11. //剪枝2:超过k个数的组合
  12. else if (path.size()>k) return;
  13. else if (sum==n&&path.size()==k) {
  14. results.add(new ArrayList<>(path));
  15. return;
  16. }
  17. //单层逻辑:剪枝3:不能保证k个数
  18. for(int i=startIndex;i<=9-(k-path.size())+1;i++){
  19. path.add(i);
  20. sum+=i;
  21. backtracking(k,n,sum,i+1);
  22. path.removeLast();
  23. sum-=i;
  24. }
  25. }

2.代码可优化的地方

  1. //单层逻辑:剪枝1:不能保证k个数
  2. for(int i=startIndex;i<=9-(k-path.size())+1;i++){
  3. path.add(i);
  4. sum+=i;
  5. backtracking(k,n,sum,i+1);
  6. path.removeLast();
  7. sum-=i;
  8. }
  9. ----------------------------------------------------------------
  10. 优化:
  11. //单层逻辑:剪枝3:不能保证k个数
  12. for(int i=startIndex;i<=9-(k-path.size())+1;i++){
  13. path.add(i);
  14. backtracking(k,n,sum+i,i+1);
  15. path.removeLast();
  16. }

3.分析

时间复杂度:O(m×2^m)

空间复杂度:O(m)

m为集合大小

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/84992
推荐阅读
相关标签
  

闽ICP备14008679号