【力扣hot100题】(020)搜索二维矩阵Ⅱ

一开始以为一行的末尾小于下一行的开头,于是傻傻的写了两二分查找,所幸的是发现了自己在二分查找上确实不怎么熟练,巩固了一下知识。

这是一开始写的错误答案:

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int left=0;
        int right=matrix[0].size()-1;
        int record=0;
        while(left<=right){
            int middle=left+(right-left)/2;
            if(matrix[0][middle]>target) right=middle-1;
            else if(matrix[0][middle]<target) {record=left;left=middle+1;}
            else return 1;
        }
        left=0;
        right=matrix.size()-1;
        while(left+1<right){
            int middle=(left+right+1)/2;
            if(matrix[middle][record]>target) right=middle;
            else if(matrix[middle][record]<target) left=middle;
            else return 1;
        }
        if(matrix[left][record]==target||matrix[right][record]==target) return 1;
        return 0;
    }
};

记起来了二分查找中left和right不能只是等于mid,而是要在mid的基础上加或减,不然会死循环,并且跳出while的条件不能包含left==right,两者相等的情况下还要继续二分。

看答案学到了二分查找的逃课快速实现法:

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        for(auto& row:matrix){
            auto it=lower_bound(row.begin(),row.end(),target);
            if(it!=row.end()&&*it==target) return 1;
        }
        return 0;
    }
};

lower_bound是一个二分查找的逃课函数,传入始末向量和target,就可以二分搜寻出最接近target的不小于target的元素,如果没有将返回end()。

答案还有一种很天才的思路:z字型查找,从右上开始搜索,如果比target小就删除最上行,比target大就删除最右行,非常高效。

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n=matrix.size();
        int m=matrix[0].size();
        int x=0;
        int y=m-1;
        while(x<n&&y>=0){
            if(matrix[x][y]>target) y--;
            else if(matrix[x][y]<target) x++;
            else return 1;
        }
        return 0;
    }
};
相关推荐
!停4 分钟前
数据结构二叉树——堆
java·数据结构·算法
一匹电信狗8 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
鱼跃鹰飞9 小时前
Leetcode会员尊享100题:270.最接近的二叉树值
数据结构·算法·leetcode
梵刹古音10 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
筵陌10 小时前
算法:模拟
算法
We་ct11 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
renhongxia111 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归
CoderCodingNo11 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法
民乐团扒谱机11 小时前
【AI笔记】精密光时频传递技术核心内容总结
人工智能·算法·光学频率梳
CoderCodingNo11 小时前
【GESP】C++五级/四级练习题 luogu-P1413 坚果保龄球
开发语言·c++·算法