算法:爬楼梯,一次可以爬1,爬2,爬3,有多少种组合。(JavaScript)

 
根据自己的理解实现的,后来看了一下其他解法,发现有两处不同:1,其他解法是排列组合,这个仅是组合 2,这个给出了具体组合的内容。
	var totalStep = 12;
	var steps = [1,2,3];
	var stepGroup = [];

	for (var i = steps.length - 1; i >= 0; i--) {
		stepGroup[i] ={key:steps[i],  count: Math.floor(totalStep / steps[i])};
	}	console.log(stepGroup);

 	var count = 0;

	 var res = findGroup(stepGroup, totalStep, []);
	 console.log(res);
	 console.log(count);
		function findGroup(stepGroup, totalStep, res){		count++;		if(totalStep <=0) {
			console.log('find', res);
			return [res];
		}

		if(stepGroup.length <=0){
			return [];
		}

		var n = 0;
		var currentStep;
		var currentStepCount;
		var first = stepGroup[0];
		currentStepCount = first.count;
		currentStep = first.key;
		var newRes = [];

		while(n <= currentStepCount){

			let cres = new Array(n);
			cres.fill(currentStep, 0);
			var sum = sumArr(cres);
			if(sum > totalStep){
				break;
			}
			let newCurRes = res.slice(0);		
			newCurRes = newCurRes.concat(cres);		
			newGroup = stepGroup.slice(1,stepGroup.length);						
			newRes = newRes.concat(findGroup(newGroup, totalStep - sum, newCurRes))
			
			n++;

		}
		return newRes;
	}

	function sumArr(arr){
		var sum = 0;
		arr.forEach(function(item, i){
			sum += item;
		})
		return sum;
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值