题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
根据题意,我们知道,这是一个从左到右增大,从上到下增大的数组。所以,我们可以选取二维数组的右上角或左下角作为比较的起点。
所以,有两种解题方法。
设在二维数组<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; //没找到
- }
- }