剑指offer-二维数组中的查找

剑指offer-二维数组中的查找

题目原题如下:

LCR 121. 寻找目标值 - 二维数组

力扣题目链接

m*n 的二维数组 plants 记录了园林景观的植物排布情况,具有以下特性:

  • 每行中,每棵植物的右侧相邻植物不矮于该植物。
  • 每列中,每棵植物的下侧相邻植物不矮于该植物。

请判断 plants 中是否存在目标高度值 target。

示例 1:

输入:plants = [[2,3,6,8],[4,5,8,9],[5,9,10,12]], target = 8

输出:true

示例 2:

输入:plants = [[1,3,5],[2,5,7]], target = 4

输出:false

思路

第一遍(错误的)

第一次写的时候,我最直接想出的思路是:利用这个排序好的规律进行查找
首先对比每一行的末尾(由题意得知,每一行的最后一个是最大的树)
找到第一个大于等于target的行。
在从这一行里头二分查找target
这个想法很快就验证失败了
第一个不方便的点是,要获取到每一行的最后一颗树,那么必须使用vector[0].size(),这样的话就很容易漏掉一个空的判断,导致程序出错。
第二个不可信的点是:即使这一行的最后一颗树是大于target的,也不一定就在这一行里头,举个简单的例子,若树的结构如下:

[ [2,3,5],
[4,6,7] ]

target=4时,我们必定会进入到第一行,从而得到错误的判断。

第二遍

第二次我换了一种思路,将矩阵当成一个整体,由题意知,这种排列顺序导致的结构是:

  • 矩阵的左上角,不管从哪个方向都是大于的。
  • 矩阵的右下角,不管从哪个方向都是小于的。

既然如此,我们应该选择矩阵的右上角和左下角,可用于判断寻路。
这里的时候还没有想到用左下角,一般情况下是先考虑的右上角。
同时这里也有一个痛点,如果去右上角,则还是需要进行一个判空。
思路如下:
从右上角开始:

  • 如果target大于当前位置的树,则向右下移动,即行++。
  • 如果target小于当前位置的树,则向左下移动,即列–。
    具体思路图如下:
    剑指offer-二维数组中的查找_第1张图片
代码实现:
class Solution {
public:
    bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {
        //获取数组右上角的起始坐标
        if(plants.size()==0)return false;
        int i = 0;
        int j = plants[0].size()-1;
        //从数组的右上角开始
        while(i<plants.size() && j>=0){
            if(plants[i][j] > target){
                j--;
            }else if(plants[i][j] < target){
                i++;
            }else{
                return true;
            }
        }
        return false;
    }
};

第三遍

看了评论区的大神题解后,我不得不感叹人与人之间的差距。
前面已经提到,有两种方式,一种是右上角一种是左下角,左下角就是最完美的做法!
从左下角开始,避免了判空,虽然只省去一行代码,但是也是我想破脑袋都想不出来的。
代码如下:

class Solution {
public:
    bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {
        //获取数组左下角的起始坐标
        int i = plants.size()-1;
        int j = 0;
        //从数组的左下角开始
        while(i >= 0 && j< plants[0].size()){
            if(plants[i][j] > target){
                i--;
            }else if(plants[i][j] < target){
                j++;
            }else{
                return true;
            }
        }
        return false;
    }
};

你可能感兴趣的:(算法,算法,数据结构)