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

目录

题目描述:

题目要求:

示例:

解题思路:

方法:

图解:

具体操作:

复杂度分析:

具体代码:


题目描述:

题目要求:

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

示例:

解题思路:

方法:

        根据条件中“从上到下递增,从左到右递增”的特点,我们可以先定义行 row 列 col ,让其起点位于整个二维数组的右上角的元素,即位于 matrix[0][matrix.size()-1] 的位置,则有:

  1. 若:matirix[row][col] > target,那么 target 一定在  matirix[row][col] 的下方;
  2. 若:matirix[row][col] < target,那么 target 一定在  matirix[row][col] 的左方。

(左下角开始与右上角开始同理,仅是大小判断与移动方向不同)

图解:

示例:

步骤: 

具体操作:

  • 首先如果 matrix.size() == 0,直接返回 false;
  • 定义起始位置右上角(或是左下角,此处以右上角为例);
    //第一行最后一列:
    int row=0;                  //行
    int col=matrix[0].size()-1; //列
    //此时 matrix[row][col] 等价于 15
  •  此时进入一个 while 循环,在其中判断 matrix[row][col] 与 targrt 的大小关系,并进行移动,同时判断。
    while(row<matrix.size() && col>=0 ){//因为此时位置是在第行最后一列,行只能向下移动,列只能向左移动
        //如果 等于,直接返回 true
        if(matrix[row][col] == target) return true;
        //大于 target,则列--
        else if(matrix[row][col] > target) col--;
        //小于 target,则行++
        else if(matrix[row][col] < target) row++;
    }

复杂度分析:

  • 时间复杂度 O(M+N):其中,M 和 N 分别为矩阵行数和列数,此算法最多循环 M+N 次。
  • 空间复杂度 O(1):row ,col 指针使用常数大小额外空间。

具体代码:

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.size()==0)return 0;//判断数组是否为0
        //利用数组特点
        int row=0;//行:第一行开始
        int col=matrix[0].size()-1;//列:最后一列开始
        while(row<matrix.size()&&col>=0){
            //如果直接相等,直接返回true
            if(matrix[row][col]==target)return true;
            else if(matrix[row][col]>target){
                col--;//target<数,则列--
            }
            else if(matrix[row][col]<target){
                row++;//target>数,则行++
            }
            //两个 else if 可简化为:
            //matrix[row][col]>target?col--:row++;
        }
            return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值