写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
import java.util.Scanner;
/**
* 写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
*
* @author Dell
*
*/
public class Test28 {
public static boolean searchMatrix(int[][] matrix,int target)
{
if(matrix.length==0)
return false;
else
{
int m=matrix.length;
int n=matrix[0].length;
int[] a=new int[m*n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
a[i*n+j]=matrix[i][j];
}
return binaryfind(a,target);
}
}
public static boolean binaryfind(int[] a,int target)
{
int start=0;
int end=a.length-1;
while(start<=end)
{
int mid=(start+end)/2;
if(a[mid]==target)
return true;
else if(a[mid]>target)
end=mid-1;
else
start=mid+1;
}
return false;
}
public static boolean solution(int[][] matrix,int target)
{
if(matrix.length==0)
return false;
else
{
int m=matrix.length;
int n=matrix[0].length;
for(int i=0;i<m;i++)
{ int j;
for(j=n-1;j>=0;j--){
if(matrix[i][j]==target)
return true;
else if(matrix[i][j]>target)
continue;
else
break;
}
if(j<0)
return false;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int[][] a=new int[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
a[i][j]=sc.nextInt();
int target=sc.nextInt();
System.out.println(solution(a,target));
}
}