这里附上参考链接:https://www.cnblogs.com/zyoung/p/6764371.html
public class Demo {
public void Perm(int list[], int k, int m) {
if (k == m) {
for (int i = 0; i <= m; i++)
System.out.print(list[i]);
System.out.println();
} else {
for (int i = k; i <= m; i++) {
// 从固定的数后第一个依次交换
Swap(list, k, i);
Perm(list, k + 1, m);
// 这组递归完成之后需要交换回来
Swap(list, k, i);
}
}
}
public void Swap(int[] list, int i, int j) {
int t = list[i];
list[i] = list[j];
list[j] = t;
}
public static void main(String[] args) {
Demo d = new Demo();
int[] arr = {1,2,3,4};
d.Perm(arr, 0, 3);
}
}
https://blog.csdn.net/summerxiachen/article/details/60579623
这是另外一种方式,但是我觉得这种方式有点麻烦
public static ArrayList<ArrayList<Integer>> permute(int[] num) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
ArrayList<Integer> temp = new ArrayList<>();
boolean bool[] = new boolean[num.length]; // 标记原数组当前位是否已摆放
Arrays.fill(bool, false);
dfs(0, list, temp, num, bool);
return list;
}
/**
*
* @param index 指示当前存储位
* @param list
* @param num 原存储空间
* @param bool 标记原数组当前位是否已摆放
* @param temp 当前存储序列
*/
private static void dfs(int index, ArrayList<ArrayList<Integer>> list, ArrayList<Integer> temp, int[] num,
boolean[] bool) {
if (index == num.length) {
list.add(new ArrayList<Integer>(temp));
return;
}
// 每一层都从0开始查找,直到第一层查找到num.length-1,递归结束
for (int i = 0; i < num.length; i++) {
if (bool[i] == false) {
bool[i] = true;
temp.add(num[i]);
dfs(index + 1, list, temp, num, bool);
temp.remove(temp.size() - 1);
bool[i] = false;
}
}
}