java枚举组合数

利用递归的思想和组合数公式,可以实现组合数的枚举,代码如下:

import java.util.ArrayList;
public class Exhaustion {
	public static void main(String [] args){
		Exhaustion ex = new Exhaustion();
		ex.nchoosek(1,5,4,new ArrayList<Integer>());
	}
	
	public void nchoosek(int n_start, int n_end, int k, ArrayList<Integer> list){
		if (k == 1){
			for (int i = n_start; i <= n_end; i ++){
				ArrayList<Integer> list_2 = (ArrayList<Integer>) list.clone();
				list_2.add(i);
				System.out.println(list_2);//对枚举结果的处理
				list_2 = null;
			}
		}
		else if (n_end - n_start + 1 == k){
			ArrayList <Integer> list_2 = (ArrayList<Integer>) list.clone();
			for (int i = n_start; i <= n_end; i ++){
				list_2.add(i);
			}
			System.out.println(list_2);//对枚举结果的处理
			list_2 = null;
		}
		else{
			nchoosek(n_start, n_end-1, k, list);
			
			ArrayList<Integer> list_2 = (ArrayList<Integer>) list.clone();
			list_2.add(n_end);
			nchoosek(n_start, n_end-1, k-1, list_2);
			list_2 = null;
		}
	}
}


可以将代码中的两处System.out.println(list_2)改为对枚举结果的操作。


输出结果:

[1, 2, 3, 4]
[5, 1, 2, 3]
[5, 4, 1, 2]
[5, 4, 3, 1]
[5, 4, 3, 2]

### Java实现枚举全排列问题 在解决全排列问题时,通常会采用回溯算法来构建解决方案。以下是基于回溯算法的Java实现方式: #### 方法概述 通过递归的方式逐步构造每一种可能的排列情况。核心思想在于交换组中的元素位置,从而生成不同的排列组合。 ```java import java.util.ArrayList; import java.util.List; public class Permutation { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<>(); backtrack(nums, 0, result); return result; } private void backtrack(int[] nums, int start, List<List<Integer>> result) { if (start == nums.length) { // 将当前排列加入结果列表 List<Integer> currentPermutation = new ArrayList<>(); for (int num : nums) { currentPermutation.add(num); } result.add(currentPermutation); } else { for (int i = start; i < nums.length; i++) { swap(nums, start, i); // 交换当前位置与其他位置的 backtrack(nums, start + 1, result); // 继续处理下一个位置 swap(nums, start, i); // 回溯,恢复原状 } } } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } public static void main(String[] args) { Permutation solution = new Permutation(); int[] nums = {1, 2, 3}; List<List<Integer>> permutations = solution.permute(nums); System.out.println("All permutations:"); for (List<Integer> permutation : permutations) { System.out.println(permutation); } } } ``` #### 关键点解析 上述代码实现了对给定整组 `nums` 的全排列计算功能。具体逻辑如下: - **递归终止条件**:当索引达到组长度时,表示已经完成了一种排列,将其存入结果集中[^3]。 - **状态更新与撤销**:通过交换操作改变组的状态,在递归调用结束后再次交换以恢复原始状态,这是典型的回溯行为[^4]。 此方法的时间复杂度为 O(n!),因为对于 n 个不同元素来说,共有 n! 种排列可能性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值