Leetcode之 Search a 2D Matrix II

题目:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted in ascending from left to right.
  • Integers in each column are sorted in ascending from top to bottom.

Example:

Consider the following matrix:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

Given target = 5, return true.

Given target = 20, return false.

代码:

方法一——(分成四块进行搜索):

class Solution {
public:
   bool helper(int i,int j,int k,int h,vector<vector<int>>& matrix,int target) {
    if (h < j || k < i)return false;
    if (target<matrix[i][j] || target>matrix[k][h])return false;
    int mid_l = i + (k - i) / 2, mid_r = j + (h - j) / 2;
    if (matrix[mid_l][mid_r] == target)return true;

    return helper(i, j, mid_l, mid_r, matrix, target)||helper(i,mid_r+1,mid_l,h,matrix,target)|| helper(mid_l + 1, j, k, mid_r, matrix, target)|| helper(mid_l + 1, mid_r + 1, k, h, matrix, target);
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
    int h = matrix.size(); if (h == 0)return false;
    int w = matrix[0].size(); if (w == 0)return false;
    return helper(0, 0, h - 1, w - 1, matrix, target);
}
};

方法二——从数组中寻找规律:

class Solution {
public:
    bool searchMatrix(vector<vector<int> > &matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        if (target < matrix[0][0] || target > matrix.back().back()) return false;
        int x = matrix.size() - 1, y = 0;
        while (true) {
            if (matrix[x][y] > target) --x;
            else if (matrix[x][y] < target) ++y;
            else return true;
            if (x < 0 || y >= matrix[0].size()) break;
        }
        return false;
    }
};

想法:

没啥想法,要开动脑筋!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值