题目意思是从该矩阵之中查找出是否有和target一样的值,若有则返回true,无则返回false。这里我用的是java。总共有三种方法,分别是暴力解题法(能过),二分查找法(就是将二维数组拆分成m个二维数组),Z字形查找法。重点是讲Z字形查找法,因为在了解该方法之后我觉得自己像傻逼一样,笨,哈哈哈,开个玩笑。这里代码我是参考的官方。
法三:
Z字形解题法原理就是二叉树,在这里的话我们是从该二维数组的最右边(假设为matrix[x][y])开始查的。根据题目意思,我们现在规定顶点是最小的,下边的结点比上面的大,同时左边的比右边的小。回到题目本身,当目标元素比matrix[x][y]大时,此时我们应该要向下开始寻找y--,因为题目中从左至右和从上至下都是升序排列的,现在我们知道了目标元素比matrix[x][y]大时,那就不可能往左边寻找了。如果想不通那就请在想一想,加油嗷。同理,x--的情况就是目标元素比matrix[x][y]小时。
代码如下:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//Z字形查找
int m=matrix.length,n=matrix[0].length;
int x=0,y=n-1;
while(x<m&&y>=0){
if(matrix[x][y]==target) return true;
else if(matrix[x][y]>target){
y--;
}else{
x++;
}
}
return false;
}
}
法一和法二:
二分查找,就是嗯,很简单,看代码吧
//1、法一
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n=matrix.length,m=matrix[0].length;
//用for-each循环
for(int[] row:matrix){
for(int element:row){
if(element==target) return true;
}
}
return false;
}
}
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//2.二分查找法
for(int[] row:matrix){
int index=search(row,target);
if(index>=0) return true;
}
return false;
}
public int search(int[] nums,int target){
int low=0,high=nums.length-1;
while(low<=high){
int mid=(high-low)/2+low;
int num=nums[mid];
if(num==target) return mid;
else if(num>target) high=mid-1;
else low=mid+1;
}
return -1;
}
}
生活愉快哦,祝你刷题快乐~