leetcode 216 Combination Sum III java 算法

题目描述:

给一个正整数n,将其分解为k个数的加和,找出所有的k个数的组合,并且这些组合相互唯一,例如1,2,3和3,2,1视为同一组

算法思路:

当选择添加这k个数中的第m个数时,则第m个数可取的最小值为min(n-前m-1个数的加和-(n-m)*9,第m-1个数的取值+1),然后用递归的方式求解即可:

代码如下:

public static List<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> ls = new ArrayList<Integer>();
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(k*9<n){
            return result;
        }
        search(k,1,1,n,result,ls,0);
        return result;
    }
    public static void search(int k,int i,int start,int n,List<List<Integer>> result,List<Integer> ls,int sum){
        if(i==k+1 && sum==n){
            List<Integer> temp = new ArrayList<Integer>(ls);
            result.add(temp);
        }
        if(sum>n || i>k+1){
            return ;
        }
        if(i<=k && sum<n){
            int newStart = ((n-sum)-(k-i)*9)>start?((n-sum)-(k-i)*9):start;
            for(int m = newStart;m<=9;m++){
                ls.add(m);
                search(k,i+1,m+1,n,result,ls,sum+m);
                ls.remove(ls.size()-1);
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值