Leetcode 240. Search a 2D Matrix II

这道题是同学问我的时候看到的,抱着solo的心态也做了一遍
第一次用的是二分和分治(刚好今晚老师也讲了分治)
然而效果好像不太佳?
先放一发题目:
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.
第一次解题的思路就是二分查找,从中间的元素开始,根据中间元素和target的大小情况来判断下一步搜索哪个范围的矩阵。

代码1

class Solution {
public:
    bool searchMatrix(vector<vector<int> >& matrix, int target, int left, int up, int right, int down) {
        if (left < 0 || left > right) return false;
        else if (up < 0 || up > down) return false;
        else if (right < 0 || right > matrix[0].size() - 1) return false;
        else if (down < 0 || down > matrix.size() - 1) return false;

        if (matrix[(up + down) / 2][(left + right) / 2] == target) return true;
        else if (matrix[(up + down) / 2][(left + right) / 2] > target)
            return searchMatrix(matrix, target, left, up, (left + right) / 2 - 1, down)
            || searchMatrix(matrix, target, (left + right) / 2, up, right, (up + down) / 2 - 1);
        else
            return searchMatrix(matrix, target, left, (up + down) / 2 + 1, (left + right) / 2, down)
            || searchMatrix(matrix, target, (left + right) / 2 + 1, up, right, down);
    }
    bool searchMatrix(vector<vector<int> >& matrix, int target) {
        return searchMatrix(matrix, target, 0, 0, matrix[0].size() - 1, matrix.size() - 1);
    }
};

好hin气啊这个代码我自己都觉得复杂,虽然AC了但是最后的分布图居然排在末尾2%
EXM????
然后虚心(?)请教了某大神,在大神的指点下,茅塞顿开,撸了一个不用二分的算法(本来就不用吧啊咧)
代码的基本思想是从右上角或者左下角开始搜索,因为从这两个方向向内搜索可以根据大小关系一次排除一列或者一行,这样比二分快了不知道多少倍(:зゝ∠)

代码2

class Solution {
  public:
    bool searchMatrix(vector<vector<int> > &matrix, int target) {
        int up = 0, right = matrix[0].size() - 1; 
        while (up < matrix.size() && right >= 0) {
            int ele = matrix[up][right]; 

            if(ele == target) return true; 
            else if(ele > target) --right; 
            else ++up; 
        } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值