每日一题 216,组合总和III

本文介绍了解决力扣每日一题216题——组合总和III的方法。通过使用回溯法,实现了找出所有总和为n的k个数的组合,组合中只允许有1-9的正整数,且组合里不能有重复的数字。

#力扣每日一题 216,组合总和III
##题目描述:找出所有总和为n的k个数的组合,组合中只允许有1-9的正整数,且组合里不能有重复的数字。

本人比较菜,刚开始毫无头绪,就想到要有k个数的话是不是得遍历1-9这几个数k遍,再判断结果。后来实现不了,百度了一下。用回溯法解决了遍历的问题,在此记录一下。

代码如下:

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
     List<List<Integer> res=new ArrayList<>();
     List<Integer> temp=new ArrayList<>();
     function_sum(res,temp,k,n,1)//1为遍历的起始数
     return res;
     }
     private void function_sum(List<List<Integer> res,List<Integer> temp,int k,int n,int from)
     {
     	if(n<0)
     	{
     		return;
     	}
     	if(k==0)
     	{
     		if(n==0)//满足条件
     		{
     			res.add(new ArrayList<>(temp));//需要new一个list
     		}
     		return;
     	}
     	for(int i=9;i>=from;i--)
     	{
     		temp.add(i);
     		function_sum(res,temp,k-1,n-i,i+1);
     		temp.remove(temp.size()-1)//这一步有点懵了
     		}
     		/**
     		*还有一种写法
     		*for(int i=from,i<=9-k+1;i++)
     		*{
     		*	temp.add(i);
     		*	function_sum(res,temp,k-1,n-i,i+1);
     		*	temp.remove(temp.size()-1)
     		*}
     		*9-k+1为啥是他,也有点懵
     		*/
     }

    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值