0
点赞
收藏
分享

微信扫一扫

剑指 Offer 04. 二维数组中的查找(C++实现)

witmy 2022-02-17 阅读 32

文章目录

1. 题目

在这里插入图片描述

2.思路

首先我们要知道查找的本质就是排除
所以当你要查找一个数时候,
你可以一个一个的查找,那么就说明你需要一个一个数的排除,
你也可以一堆一堆的查找,这样就可以一堆一堆的排除;
很明显,在排除的基础上, 谁排除得更多,那么就说明谁查找得更加快;


所以:这道题思路一:直接遍历二维数组,一个一个数得查找,肯定能够找到数是否在这个二维数组中;当是这种效率极其低下,也就是说明排除得效率也很低,一个一个得排除;
思路二:利用题目条件,提高算法的效率,题目说从左到右,从上到下,数都是依次递增的;那么我们就可以,获取,最右上角的值,作为参考,因为最右上角的值,是该行最大的数,该列最小的数,假如比该值要大的数,就排除了该数的一行的数,假如比该数要小,那么久排除了该数的一列的数;


画图演示以下
在这里插入图片描述


3.代码演示

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
    	//考虑到二维数组没有数
        if(matrix.size() == 0) return false;
        
        //定义出二维数组最右上角的数
        int i = 0; //行数
        int j = matrix[0].size()-1; //第一行最后一个元素的下标

        while(i < matrix.size() && j >= 0)
        {
            //matrix[i][j]一定是i行的最大值,j列的最小值
            if(target < matrix[i][j])
            {
                //满足这个条件,表示比该列j 的最小值还要小,排除该列
                j--;
            }
            else if (target > matrix[i][j])
            {
                 //满足这个条件,表示比行i 的最最大值还要大,排除该列
                i++;
            }
            else
            {
                //找到了
                return true;
            }
        }
        return false;
    }
};
举报

相关推荐

0 条评论