题目:已知一个二维数组A[n][n],其中每行的元素按从小到大的顺序排好,每列的元素也按从小到大的顺序排好,问给定一个元素v,是否在数组中存在?
方案一:暴力方法。逐个遍历进行比较。时间复杂度为O(n^2)
方案二:对上面的方法进行改进,因为每行是有序的,对每行进行二分查找,共n行。时间复杂度为O(nlogn)
分析:上述两个方案对规模较小的数组表现的性能比较好,并且有很好的可读性。
但方案一没有利用有序的条件,而方案二只是利用了行有序的条件,没有利用列有序的条件。
方案三:从矩阵的右上角开始,即i=0, j=n-1开始遍历。若是小则向左,若是大则向下。边界条件是j<0或是i>n-1。时间复杂度为O(n)
代码:
while (没有超过边界)
{
if ( A[i][j] > v )
--j;
else if ( A[i][j] < v )
++i;
else
return A[i][j];
}