JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)

这篇博客介绍了如何使用JAVA算法设计解决给定整数n和k,求1到n的所有k个数的组合问题。当n=4,k=2时,返回的组合包括[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]。文章主要探讨了回溯和递归算法的应用。" 123116711,8659342,深入解析Mybatis中的JDK动态代理机制,"['Java', '后端开发', 'Mybatis', '设计模式', '动态代理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。、

当 n = 4 ,k = 2 时;
结果为: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]


算法设计

package com.bean.algorithmbasic;

import java.util.LinkedList;
import java.util.List;

public class CombinationsDemo5 {

	/*
	 * n = 4 and k = 2
	 * 结果: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
	 * 
	 */

	// 全局变量,存储返回结果
	private List<List<Integer>> ret = new LinkedList<List<Integer>>();

	public List<List<Integer>> combine(int n, int k) {
		// 非法条件:一旦出现以下条件,直接返回空
		if (n <= 0 || k <= 0 || k > n)
			return ret;

		// 初始化一个可能结果c,当前c为空;c中存储一个可能的组合结果(c这个链表在整个过程是会变的)
		LinkedList<Integer> c = new LinkedList<Integer>();

		/
Java中,你可以使用递归回溯算法(也称为“深度优先搜索”)来生成所有可能的k个数组合。这里是一个递归解决方案: ```java import java.util.ArrayList; import java.util.List; public class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> result = new ArrayList<>(); List<Integer> currentCombination = new ArrayList<>(); combineHelper(n, k, 1, currentCombination, result); return result; } private void combineHelper(int n, int k, int start, List<Integer> currentCombination, List<List<Integer>> result) { if (k == 0 || start > n) { // 如果k为0或者start超过n,结束当前路径并添加到结果中 if (currentCombination.size() > 0) { result.add(new ArrayList<>(currentCombination)); } return; } // 尝试将当前数字加入组合 currentCombination.add(start); // 继续递归处理剩下的数字 combineHelper(n, k - 1, start + 1, currentCombination, result); // 移除当前选择,以便尝试下一个数字 currentCombination.remove(currentCombination.size() - 1); // 后退一步,恢复到上一个状态 combineHelper(n, k, start + 1, currentCombination, result); } } ``` 这个方法首先定义了一个空的结果列表一个当前组合,然后调用`combineHelper`函数。`combineHelper`会检查是否达到结束条件(k为0或start大于n),如果满足则将当前组合添加到结果中。否则,它会选择一个新的数字并继续递归地尝试其他可能组合。 当所有数字都被尝试过,但k个数还没有达到时,就回溯到上一个状态,移除最后一个数字并尝试其他的组合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值