参考博客:
java实现排列组合(通俗易懂)
import java.util.Stack;
/**
* @author
* @create 2021-04-17 13:44
*/
public class Permutation {
public static void main(String[] args) {
int[] nums = {1,2,3,4};
// repeatableSelection(nums,4,0);//可重复选择
// permutation(nums,4,0);//排列
combination(nums,3,0,0);//组合
System.out.println("共有"+total+"种");
}
private static Stack<Integer> stack = new Stack<>();
private static int total;
/**
* 题目一:可重复选择
* @param nums 数组
* @param count 可重复选择的次数
* @param curCount 当前选择的次数
*/
public static void repeatableSelection(int[] nums, int count, int curCount){
if (count == curCount){
total++;
System.out.println(stack);
return;
}
for (int i =0;i<nums.length;i++) {
stack.add(nums[i]);
repeatableSelection(nums, count, curCount + 1);
stack.pop();
}
}
/**
* 题目二:排列,加一个判断即可
* @param nums
* @param count
* @param curCount
*/
public static void permutation(int[] nums, int count, int curCount){
if (count == curCount){
total++;
System.out.println(stack);
return;
}
for (int i =0;i<nums.length;i++) {
if (!stack.contains(nums[i])){
stack.add(nums[i]);
permutation(nums, count, curCount + 1);
stack.pop();
}
}
}
/**
* 题目三:组合,在1,2,3,4,中选3个有多少种组合方式
* @param nums 数组
* @param count 选几个数
* @param curCount 当前已经有了几个数
* @param index 当前到达的下标
*/
public static void combination(int[] nums, int count, int curCount, int index){
if (count == curCount){
total++;
System.out.println(stack);
return;
}
for (int i = index; i < nums.length; i++) {
if (!stack.contains(nums[i])){
stack.add(nums[i]);
combination(nums,count,curCount+1,i);
stack.pop();
}
}
}
}