// RIGHT MOST => LARGER next row.
// => LESS left col
123
456
789
find 5, ROW should be 1
m = 0+2 /2 = 1, 4 < 5, l = 1+1 =2
m= 2+2 /2 =2, 7 > 5, r = 2-1 =1, l > r , STOP
1,4,7
4=> 4,5,6
find 3 , ROW should be 0
m=0+2 /2 =1 , 4 > 3 , r = m-1 = 0
m = 0+ 0 /2 = 0, 1 < 3 , l = 0+1 =1 , l >r, STOP
find 9, ROW should be 2
m=0+2 /2 = 1 , 4 < 9, l = m+1 = 2
m = 2+2 /2 =2 , 7 < 9, l = 2+1 =3, l > r=2 , STOP
2. Implementation
public boolean FindElem(int[][] matrix, int target, int M, int N)
{
// validate the input
if ( target == null )
return true;
if ( matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
int l = 0;
int r = M;
//while ( l < r)
while( l <= r)
{
int m = (l+r)/2;
if ( martix[m][0] == target)
return true;
if ( matrix[m][0] < target )
l = m+1;
else
r = m-1;
}
// NOTE:
//int row = l;
if ( r < 0)
return false;
int row = r;
int l = 0;
int r = N;
while ( l <= r)
{
int m = (l+r)/2;
if ( matrix[row][m] == target)
return true;
if ( matrix[row][m] < target)
l = m+1;
else
r = m-1;
}
return false;
}
// RIGHT MOST => LARGER next row.
// => LESS left col
public boolean FindElem(int[][] matrix, int target, int M, int N)
{
int row = 0;
int col = N-1;
while ( row < M && col >=0 )
{
if ( matrix[row][col] == target )
return true;
else if ( martix[row][col] > target ) //1,2,3=> 3 > 2
col--;
else // 1,4,7
{
row++
}
}
return false;
}
3. Similar Ones
No comments:
Post a Comment