大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
文章目录
关于Java全排列的极限优化
我要吹爆发现这个算法的人!之前有一次比赛,递归算法没想出来,后来实在觉得是这种排列思路,但数据量太大了,普通全排列硬算都得跑很久。就想起了这个算法,没想到再加上人工判断,算对了!总之这种排列优化很不错!
适用场景: 包含很多重复元素,有需要进行全排列的类型!
/*
* @Author: motongxue
* @Date: 2020-10-16 23:05:17
* @LastEditors: motongxue
* @LastEditTime: 2020-10-16 23:49:58
* @Blog: https://motongxue.cn
* @Description: file content
*/
import java.util.Arrays;
public class Main{
static int[] a = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
static int[] a1 = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 };
static boolean[] vis = new boolean[12];
static int[] path = new int[12];
static int cnt = 0;
static int cnt1 = 0;
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
dfs(0);
System.out.println("total amount of method first :" + cnt);
long endTime = System.currentTimeMillis();
System.out.println("Time taken for tests: " + (endTime - startTime) + " ms");
System.out.println("====================");
startTime = System.currentTimeMillis();
dfs2(0);
System.out.println("total amount of method second :" + cnt1);
endTime = System.currentTimeMillis();
System.out.println("Time taken for tests: " + (endTime - startTime) + " ms");
}
private static void dfs(int k) {
if (k == 12) {
// System.out.println(Arrays.toString(path));
cnt++;
return;
}
for (int i = 0; i < 12; i++) {
if (i > 0 && a[i] == a[i - 1] && !vis[i - 1]) // 妙到呱呱叫啊!
continue;
if (!vis[i]) {
vis[i] = true;
path[k] = a[i];
dfs(k + 1);
vis[i] = false;
}
}
}
private static void dfs2(int k) {
if (k == 12) {
// System.out.println(Arrays.toString(a1));
cnt1++;
return;
}
for (int i = k; i < 12; i++) {
{
int t = a1[k];
a1[k] = a1[i];
a1[i] = t;
}
dfs2(k + 1);
{
int t = a1[k];
a1[k] = a1[i];
a1[i] = t;
}
}
}
}
运行结果
思考:
如何用这种方法实现七段码问题?
https://blog.csdn.net/CrazyMooo/article/details/109342123#t14
思考思考!巨妙啊😁
2020年月日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn