【剑指offer】04.二维数组中的查找
题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路1:
暴力搜索,不考虑该数组已经排序的特点,一一比较,时间复杂度O(n^2).
思路2:
以右上角的那个数为比较对象(通过观察发现,右上角那个数为一个临界点)
若x>a,则x比该行都大(跳过该行)
若x<a,则x比该列都小(跳过该列)
时间复杂度O(n)
代码:
public class jz04 {
public static void main(String args[]){
int matrix[][] = {
{1,2,8,9},
{2,4,9,12},
{3,7,10,13},
{6,8,11,15}
};
}
public static boolean findx(int matrix[][], int x){
if(matrix == null || matrix.length<1 || matrix[0].length<1)
return false; //end function.
int rows = matrix.length;
int cols = matrix[0].length;
int row = 0;
int col = cols - 1; //从数组右上角开始
while(row<rows && col>=0){
if(matrix[row][col] == x)
return true;
else if(matrix[row][col] < x)
row++;
else
col--;
}
return false;
}
}
总结:
- 学会观察题目(有序,查找),借鉴二分法查找。
- 弄清楚输入输出是什么,参数有哪几个。