行递增列递增矩阵寻找是否包含元素x

行递增列递增矩阵寻找是否包含元素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;
}

仅个人记录一下比较好的自己原创的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值