解题思路(一)
** 其实我觉得如果在项目中遇到这个题型的话,先创建一个String类的对象,然后将matrix传进去,接着调用String.contains(target)方法就行了。哈哈哈哈~~~~~~,好了,下面进入正题,笨方法就是把二维数组变成一维数组,然后再排序,接着用二分查找法找到目标元素。但是这个方法好像在leetcode上执行代码时候正确,但是提交的时间会出发超出时间时间限制。。。。因为这个笨方法的时间复杂度达到了O(n²),或许领扣允许最大的时间复杂度为O(1)吧,具体看代码!
**
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==0){
return false;
}
int[] newmatrix=new int[matrix.length*matrix[0].length];//创建一维数组
int k=0;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
newmatrix[k]=matrix[i][j];//将二维数组的值传给一维数组
k++;
}
}
Arrays.sort(newmatrix);
int first=0;
int last=newmatrix.length-1;
int mid=0;
while(first<=last){//二分查找
mid=(first+last)/2;
if(newmatrix[mid]<target){
first=mid+1;
}
else if(newmatrix[mid]>target){
last=mid-1;
}
else{
return true;
}
}
return false;
}
关于为什么会想到笨方法呢。。。因为我刚做这道题的时候发现我折半查找法居然给忘了!没错,真的是忘了,我佛了。具体看代码的运行结果吧,其实可以在Eclipse上试一试。
提交的时候就。。。。。。
接下来是第二种方法。
解题思路
其实做这种二维数组找元素的题是有套路的。。。找对角元素切入,无非就是左上、左下、右上和右下这几个元素。我们发现左上和右下这两个元素它们的两个方法的数不是全增就是全减,所以这两个数不灵活,我们就不要从这两个方法开始,我们要找的这个出发点,它的两个方法,必须一个是递增一个是递减。那我们就从左下或者右上这两个方法出发吧。我暂且从左下出发。具体看代码实现。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==0){
return false;
}
//从18这个元素出发
int row=matrix.length;
int col=matrix[0].length;
//定义x横向变量和y纵向变量。
int x=row-1;
int y=0;
/*
循环继续条件
*/
while(x>=0&&y<col){
if(target==matrix[x][y]){
return true;
}else if(target>matrix[x][y]){
y++;
}else{
x--;
}
}
return false;
}
}