在排序矩阵中查找元素
2022-09-03 09:10:05
						问题:给定一个矩阵,其中对每行和每列进行排序,请编写一个方法来查找其中的元素。
这是一个经典的面试问题,这是我的解决方案
boolean F(int[][] matrix, int hs, int he, int ws, int we)
{
    if (hs > he || ws > we) 
        return false; 
    int m = (hs + he) / 2; 
    int n = (ws + we) / 2;
    if (matrix[m][n] == t)
    {
        return true;
    }
    else if (matrix[m][n] < t)
    {
        // find the ele in the same row, right to [m][n]
        F(m, m, n + 1, we);
        // find the ele in the same col, upper to [m][n]
        F(m + 1, he, n, n);
        // find the ele in the area, where i>m,j>n 
        F(m + 1, he, n + 1, we);       
    } 
    else if (matrix[m][n] > t)
    {
        // very similar to previous part
    }
}
该算法的运行时间为 log(m) + log(n)。我正在寻找一种更有效的算法,或者使用简洁的代码。
有了更多的评论,我想出了以下代码:
// return target recurrence in the matrix
int F(int[][] m, int rs, int re, int cs, int ce, int t){
   int r1 = rs, r2 = re;
   int c1 = cs, c2 = ce;
   int r=0 , c = c1;
   while( r1 < r2 && c1 < c2 ){
   // find the last element that <= t in column c
     r  = FlastLess( r1, r2, c, t)
     if( r == -1 ) break;
     else{
       // find the first ele in the row that is >=t
       c = FfirstGreater( r, c1, c2, t);
       if( c == -1)  break;
       else{
         r2 = r; 
         c1 = c; 
       }// else    
     }// else 
   }// while
}// f
下面是函数 F1 和 F2 的链接 查找排序数组中大于目标的第一个元素
void FlastLess(int s, int e, int t){
  int l = s, h = e;
  while( l != h ){
     int mid = (l+h)/2;
     if( mid >=  t) high = mid - 1; 
     else {
       if( high < t) low= mid + 1;
       else low = mid;
     } 
  }
 void FfirstGreater(int s, int e, int t){
  while(l < h){
    mid = (l+h)/2;
    if ( mid <=  t) low = mid+1;
    else high = mid;
  }
 }
}
 
					 
				


 
				    		 
				    		 
				    		 
				    		