判断一个n*n矩阵是不是拉丁方~
复杂度好点的算法
复杂度好点的算法
解决方案 »
- 栈实现整数加法器的问题
- 为什么我用hibernate连接SQL 2005 他报错
- commit用法请教
- 新手请教:JAVA编程思想中的一个匿名类的例子,调试出错。谢谢。
- 请大家帮我看看,我这个最简单的在PANEL上显示一条信息,为什么显示不出来!(在线等)
- 我用timer写了一个定时执行的类!但是这个类提示有错误,大家帮我看看什么原因引起的?
- 请教窗口事件中的void windowIconified(windowEvent e)方法是干什么用的?
- 关于如何使用xsl显示xml的总结
- 找JBUILDER7.0及注册机下载地址
- 一个希望过来人回答的问题!
- MyEclipse 6.5汉化包谁给个我
- 请教,怎样按条件复制CSV文件内容到另一个CSV文件
可以考虑用Arrays类来做,一行一个数组。然后提取每列的对应元素新建列数组。做比较
n 较大的就用数组判重public class Test { public static void main(String[] args) { int[][] matrix = {{1,2,3,4,5,6,7,8,9},{2,3,4,5,6,7,8,9,1},{3,4,5,6,7,8,9,1,2},
{4,5,6,7,8,9,1,2,3},{5,6,7,8,9,1,2,3,4},{6,7,8,9,1,2,3,4,5},
{7,8,9,1,2,3,4,5,6},{8,9,1,2,3,4,5,6,7},{9,1,2,3,4,5,6,7,8},
};
System.out.println(isLadinMatrix(matrix));
}
public static boolean isLadinMatrix(int[][] matrix){
int result = 0;
for (int i = 0; i < matrix.length; i++) {
result |= 1 << i;
if(matrix[i].length != matrix.length)
return false;
}
if(matrix.length > 64)
return isLadinMatrix02(matrix);
long[] temp = new long[2 * matrix.length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
temp[i] ^= 1 << (matrix[i][j] - 1);
temp[j + matrix.length] ^= 1 << (matrix[i][j] - 1);
}
}
for (int i = 0; i < temp.length; i++) {
if((temp[i] & result) != result) return false;
}
return true;
} private static boolean isLadinMatrix02(int[][] matrix){
//未完成
//仿 isLadinMatrix 改写,上边是用位运算,这里是用数组代替
boolean[][] temp = new boolean[2 * matrix.length][matrix.length];
return false;
}
}
要提高速度最容易想到的是hash/bitmap/空间换时间
这里采用后面两种
用java.util.BitSet简单实现下就行
用来判断循环到某位置的时候,
这个位置对应的行,列是否有和它值一样的情况,
有了直接返回false
时间复杂度初步估计为O(n^2)
public static boolean test(int[][]a) {
//异常条件判断
if(a == null ) return false;
int length = a.length;
for(int i=0;i<a.length;i++) {
if(a[i] == null || a[i].length != length) {
return false;
}
}
//
System.out.println("gg");
BitSet []b1 = new BitSet[length];
for(int i=0;i<length;i++) {
//初始均为false
b1[i] = new BitSet(length+1);
}
BitSet []b2 = new BitSet[length];
for(int i=0;i<length;i++) {
//初始均为false
b2[i] = new BitSet(length+1);
}
for(int i=0;i<length;i++) {
for(int j=0;j<length;j++) {
if(b1[a[i][j]-1].get(i)) {
return false;
}else {
b1[a[i][j]-1].set(i, true);
}
if(b2[a[i][j]-1].get(j)) {
return false;
}else {
b2[a[i][j]-1].set(j, true);
}
}
}
return true;
}
仅供test之用
嘿嘿
例如9*9的矩阵
里面有个值为非1-9的值