Java解决组合问题(Leetcode 77)

在我学习回溯算法的时候,找到了这道经典的题开始做,参考了不少大佬的理解,然后自己琢磨出了比较简陋的解答。
关键还是在于理解回溯:
回溯模板):

void backtracking(参数){//个人觉得参数这部分因人而异,用到啥就写啥
if(终止条件){//这里相当于二叉树的叶子结点,相当于收割果实的条件
		收集结果,比如符合条件的组合
		然后return,回到上一层
	}
for(遍历集合里的元素,遍历完它){
	处理节点,比如1234
	递归开始:backtracking(参数)
	递归会改变节点后面跟的元素,回溯,用于继续递归
	}
}

题目:给定两个整数 n 和 k
返回 1 … n 中所有可能的 k 个数的组合。

组合:无序->相当于高中的在这里插入图片描述

排列:有序->相当于高中的在这里插入图片描述

下面是代码实现

public class Solution {
	  public List<Integer>path=new ArrayList<>();
	  public List<List<Integer>>result=new ArrayList<List<Integer>>();
	public List<List<Integer>> combine(int n, int k) { {
		backstracking(n,k,1);
		return result;
		
	}
	}
	public void backstracking(int n,int k,int startIndex) {
		if(path.size()==k) {

			result.add(new  ArrayList(path));

			return ;
		}

		
		for(int i=startIndex;i<=n;i++) {
			path.add(i);
			backstracking(n,k,i+1);
			path.remove(path.size()-1);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值