【剑指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;
}
}
总结:
- 学会观察题目(有序,查找),借鉴二分法查找。
- 弄清楚输入输出是什么,参数有哪几个。
本文介绍了一种在已排序的二维数组中查找特定整数的高效算法。通过利用数组的排序特性,采用类似于二分查找的方法,从数组的右上角开始,根据目标值与当前值的比较结果,决定是向下还是向左移动,从而达到O(n)的时间复杂度。
188

被折叠的 条评论
为什么被折叠?



