如何实现带长度限制的排列?基于现有Java全排列代码的实现方案问询
带长度限制的排列实现方案
核心修改思路
- 新增入参
k用来指定需要生成的排列长度 - 调整递归终止条件:当递归深度
pos等于k时,就截取数组前k个元素存入结果集,不需要继续递归到数组末尾 - 原有交换、回溯逻辑完全保留,仅调整终止判断和结果截取规则
完整修改后代码
import java.util.ArrayList; // 对外调用方法新增参数k,指定需要生成的排列长度 static ArrayList<int[]> permutations(int[] a, int k) { // 可选:参数合法性校验 if (k < 1 || k > a.length) { throw new IllegalArgumentException("排列长度k取值范围为1到数组长度"); } ArrayList<int[]> temp = new ArrayList<>(); permutation(a, 0, k, temp); return temp; } // 递归方法新增k参数 public static void permutation(int[] arr, int pos, int k, ArrayList<int[]> list){ // 终止条件修改:pos等于k时直接保存前k位,停止递归 if(pos == k) { int[] res = new int[k]; System.arraycopy(arr, 0, res, 0, k); list.add(res); return; } for(int i = pos; i < arr.length; i++){ swap(arr, pos, i); permutation(arr, pos+1, k, list); swap(arr, pos, i); } } public static void swap(int[] arr, int pos1, int pos2){ int h = arr[pos1]; arr[pos1] = arr[pos2]; arr[pos2] = h; }
调用示例
要生成1234的4P2排列,调用方式如下:
public static void main(String[] args) { int[] arr = {1,2,3,4}; ArrayList<int[]> res = permutations(arr, 2); // 输出结果 for (int[] item : res) { System.out.println(item[0] + "" + item[1]); } }
运行后会输出所有4取2的排列结果:12、13、14、21、23、24、31、32、34、41、42、43。
内容的提问来源于stack exchange,提问作者Gbeck
相关产品推荐
相关产品推荐

