题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
根据题意,我们知道,这是一个从左到右增大,从上到下增大的数组。所以,我们可以选取二维数组的右上角或左下角作为比较的起点。
所以,有两种解题方法。
设在二维数组<i,j>位置的值为array[i][j],要找的整数为target。
第一种,选取二维数组的右上角作为比较的起点。
如果array[i][j]>target,说明大了,所以需要往左走,让array[i][j]变小,即i--;
如果array[i][j]<target,说明小了,所以需要往下走,让array[i][j]变大,即j++;
如果array[i][j]== target,说明找到了,返回true;
如果还是找不到,返回false;
第二种,选取二维数组的左下角作为比较的起点。
如果array[i][j]>target,说明大了,所以需要往上走,让array[i][j]变小,即j--;
如果array[i][j]<target,说明小了,所以需要往右走,让array[i][j]变大,即i++;
如果array[i][j]== target,说明找到了,返回true;
如果还是找不到,返回false;
代码
public class Solution {
public boolean Find(int target, int [][] array) {
//第一种解法,从右上角开始比较
int colLength = array[0].length; //列数
int row = 0, column = colLength-1; //i,j表示起始比较点位于右上角
for(;row < colLength && column >= 0;) {
if (target == array[row][column]) return true;
else if (target > array[row][column]) row++; //往下走
else column--; //往左走
}
return false;
}
}
public class Solution {
public boolean Find(int target, int [][] array) {
//第二种解法,从左下角开始比较
int rowLength = array.length; //行数
int row = rowLength-1, column = 0; //i,j表示起始比较点位于左下角
for(;row >= 0 && column < array[0].length;) {
if (target == array[row][column]) return true; //找到了
else if (target > array[row][column]) column++;//往右走
else row--; //往上走
}
return false; //没找到
}
}