• 剑指Offer二维数组中的查找


    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    例如,数组为

    1 2 8 9

    2 4 9 12

    4 7 10 13

    6 8 11 15

    如果在数组中查找数字9,则返回true;如果查找数字20,则返回false。

    思路:元素是分别按行按列递增,但是每一行(列)的元素不一定都比前一行(列)元素大。因此,我们要利用元素的排列特点,按照一定的规律去寻找元素。

    由于已经知道每一列是从上到下递增排序,我们先选左下角的第一个元素,即第一列的最大值,作为起始元素(记为p=a[row][col])比较元素;

      当待寻找元素num>p时,说明第一列不含该元素(p已是该列最大值),因此p要按行递增(col++);

      若num<p,说明最后一行不含该元素,因此p要按列递减(row--);

      若num == p,则返回true。这样做的目的就是,每一步缩小搜索的范围(矩形)。

    误区:当看到元素是按行按列递增时,可能第一反应是左对角的二分搜索,而这种情况会发现有重叠,判断条件过多容易导致思维混乱。

    code:

     1 bool Find(int *matrix, int rows, int columns, int num)
     2 {
     3     bool Found = false;
     4     if (matrix == NULL || rows <= 0 || columns <= 0)
     5     {
     6         return Found;
     7     }
     8     //起始元素为矩阵左下角元素
     9     int nRow = rows - 1;
    10     int nCol = 0;
    11 
    12     while (nRow >= 0 && nCol < columns)
    13     {
    14         if (matrix[nRow * columns + nCol] == num)
    15         {
    16             Found = true;
    17         }
    18         if (matrix[nRow * columns + nCol] < num)
    19         {
    20             ++nCol;
    21         }
    22         else
    23         {
    24             --nRow;
    25         }
    26     }
    27     return Found;
    28 }

    ps:《剑指OFFER》上的起始元素是按右上角选取。

  • 相关阅读:
    设置div内的内容不能被选中
    js中!和!!的区别及用法
    echars自定义提示框位置
    数组排序
    查询一个表的不同数据,显示到一个表
    document.body
    设置fixed,横向滚动条失效
    scrollTop
    JS 数组
    JS 数学函数
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3052087.html
Copyright © 2020-2023  润新知