行递增列递增矩阵寻找是否包含元素x
2019.9.16 lab实验课的解题。
题目描述
输入为N*N的矩阵,它已经出现在内存中。矩阵的每一行从左到右递增,矩阵的每一列从上到下递增,从中检查x是否出现在矩阵中。
算法如下
先排除多余情况。假设要找的x为48,从最下行开始找起,找到第一个比48大的数,则左下向量的列数变为当前列,再找最右列,找到第一个比48大的数,则右上向量的行数变为当前行,再找删除多余元素的矩阵(两个向量之间的矩阵)的最上行,找到第一个比48大的数,则右上向量的列数为当前列-1,再找此矩阵最左列,找到第一个48大的数,则左下向量的行数为当前行-1。如此反复,直到左下与右上向量出现重合。
代码如下
public static int xinmatrix(int[][]list,int x) {
int n=list.length;
vector ld=new vector();
vector ru=new vector();
ld.row=n-1;ld.column=0;
ru.column=n-1;ru.row=0;
boolean found=false;
if(x>list[n-1][n-1]||x<list[0][0])return -1;
while(ru.column-ld.column>=0&&ld.row-ru.row>=0&&!found){
for(int i=ld.column;i<=ru.column;i++) {
if(list[ld.row][i]==x){found=true;break;}
if(list[ld.row][i]>x){ld.column=i;break;}
}
for(intj=ru.row;j<=ld.row;j++) {
if(list[j][ru.column]==x){found=true;break;}
if(list[j][ru.column]>x){ru.row=j;break;}
}
for(int k=ru.row;k<=ld.row;k++) {
if(list[k][ld.column]==x){found=true;break;}
if(list[k][ld.column]>x){ld.row=k-1;break;}
}
for(int l=ld.column;l<=ru.column;l++) {
if(list[ru.row][l]==x){found=true;break;}
if(list[ru.row][l]>x){ru.column=l-1;break;}
}
if(ru.column==ld.column){
for(intm=ru.row;m<=ld.row;m++) {
if(list[m][ru.column]==x) found=true;break;
}
}
if(ru.row==ld.row){
for(intnn=ld.column;nn<=ru.column;nn++) {
if(list[ld.row][nn]==x) found=true;break;
}
}
if(found)return 1;
else return -1;
}
}
class vector{
int row;
int column;
}
仅个人记录一下比较好的自己原创的算法。