常见算法之16---二维数组中查找元素

题目:已知一个二维数组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];
}

 
原文地址:https://www.cnblogs.com/xiaoChongUp/p/3359991.html