剑指Offer刷题笔记——二维数组中的查找

题目描述

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

问题分析

根据问题,我们可以简单的构想出数组大概的规律。由于右大于左,且下大于上。那么左上角一定是该数组中最小的元素,右下角一定是该数组中最大的元素。如果从这两个位置遍历整个数组,显然是最耗时的。所以我们可以想到,从左下角的元素和右上角的元素遍历。

思路

那么我们假定从左下角的元素开始遍历。

  1. 设左下角的元素为a,目标元素为target。
  2. 如果a == target,那么返回True。
  3. 如果a > target,说明target比a小,那么按照下大于上的原则,a所在的行应该向上移动。
  4. 如果a < target, 说明target比a大,那么按照右大于左的原则,a所在的列应该向右移动。
  5. 按照上述步骤,直到a的行号超出边界或列号超出边界时,返回False,否则找到该元素相等,返回True。

代码

C++版本

public:
    bool Find(int target, vector<vector<int> > array) {
        int row = array.size() - 1; //使得初始的行为最后一行
        int col = 0; //使得初始的列为第一列
        //从左下角的元素开始。
        while(row >=0 && col < array[0].size())
        {
            if(target == array[row][col])
                return true;
            if(target > array[row][col]) //思路4
                col++;
            else //思路5
                row--;
        }
        return false;
    }
};

Python版本

占坑
发表新评论