剑指offer-二维数组的查找

详解有序二维数组的查找算法#副标题

Posted by BY Tony Huang on May 12, 2019

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都是递增排序。如果在这个数组中查找数字7,则返回true;如果数组中不含有该数字,则返回false。 二维数组

算法思想:

由于二维数组有序,先选取最右上角数字array[row][column]与target比较

  1. 如果两者相等,则返回true,查找过程结束;
  2. 如果array[row][column]比target大就缩小一列(array[row][column]所在列)的寻找范围;
  3. 如果array[row][column]比target小就缩小一行(array[row][column]所在行)的寻找范围;

一直寻找下去直到遍历好整个数组,如果能找到目标数字,返回true,反之则返回false,代码是参考我在牛客网上写的,注意代码的鲁棒性,输入array为空情况的返回要false

代码: ```class Solution { public: bool Find(int target, vector<vector > array) { bool find=false; int i=7; int rows=array.size(); int columns=array[0].size();

    if((rows>0)&&(columns>0))
    {
        int row=0;
        int column=columns-1;
        while((row<rows)&&(column>=0))
        {
            if(array[row][column]==target)
            {
                find=true;
            break;
            }
            else if(array[row][column]>target)
            {
                column--;
            }
            else
            {
                row++;
            }
            
        }
    }
    return find;
} }; ``` 也可以尝试选取最左上角的数字与target比较,原理一样,这里不再赘述。