[LeetCode] 74. Search a 2D Matrix

74. Search a 2D Matrix (二维数组中的查找)



1. 题目翻译

给定一个m * n的二维数组和一个要查找的值,在该二维数组中查找给定的值。如果存在返回true否则返回false。

该数组有以下性质:

  1. 每行都是递增排列的
  2. 每列都是递增排列的

例子:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3, 返回 true.

2. 解题方法

二分查找的变形,将数组分成4块,如图所示

这里写图片描述

将每组的第一个值,即左上角的值与target比较

  1. 如果比target大则说明在这个分组中不可能存在target(因为每个块中左上角的值是最小的)返回false。
  2. 如果等于target就返回true。
  3. 如果小于target,需要确认这个分组中是不是只用这一个值,如果是则返回false。如果不是,使用递归继续分组。

3. 代码

class Solution {
private:
    bool search(vector<vector<int>>& matrix, int i, int j, int m, int n, int target) {
        /* i,m 是该分块中,左上角的值的坐标,j,m是该分块中,右下角值的坐标,通过这四个值可以确定分块的范围。*/
        if (i > j || m > n)               
            return false;

        if (matrix[i][m] == target)
            return true;
        else if (matrix[i][m] > target)
            return false;
        else {
            if (i >= j && m >= n)
                return false;
            int a = i+(j - i) / 2;
            int b = m+(n - m) / 2;

            //将数组分为四块,并递归求解
            return search(matrix, i, a, m, b, target) || 
                search(matrix, i, a, b + 1, n, target) ||
                search(matrix, a + 1, j, m, b, target) || 
                search(matrix, a + 1, j, b + 1, n, target);
        }
    }
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int a = matrix.size();
        if (a == 0)
            return false;
        int b = matrix[0].size();
        if (b == 0)
            return false;
        return search(matrix, 0, a-1, 0, b-1, target);

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值