当前位置: 首页 > article >正文

71 搜索二维矩阵

搜索二维矩阵

    • 题解1 Z字查找(tricky)
    • 题解2 一次二分查找
    • 题解3 两次二分查找

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

在这里插入图片描述
提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • − 1 0 4 -10^4 104 <= matrix[i][j], target <= 1 0 4 10^4 104

题解1 Z字查找(tricky)

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        // z字查找的思路,适用于每行有序、每列有序的情形
        // 但这题的条件更强,即如果按行优先来看下标小的元素总是小于下标大的,直接二分会更快
        int m = matrix.size(), n = matrix[0].size();
        int r = 0, c = n-1;
        while(r >= 0 && c >= 0 && r < m && c < n){
            if(target > matrix[r][c]){
                r ++;
            }else if(target < matrix[r][c]){
                c --;
            }else return true;
        }
        return false;
    }
};

在这里插入图片描述

题解2 一次二分查找

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();
        // 按行合并(torch.cat(dim = 0))
        // 1234 2345 ...
        int l = 0;
        // 1D数组 尾下标
        int r = m*n-1;
        while(l <= r){
            int mid = l + (r-l)/2;
            // row = mid/n; column =mid%n
            if(matrix[mid/n][mid%n] == target) return true;
            else if(matrix[mid/n][mid%n] > target){
                r = mid-1;
            }else{
                l = mid+1;
            }
        }
        return false;
    }
};

在这里插入图片描述

题解3 两次二分查找

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
    	// 从第一列找第一个大于target的下标 row
    	// 这么做是因为题目限制:每行的第一个整数大于前一行的最后一个整数
        auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {
            return b < a[0];
        });
        // 如果是第一行说明第一个数就大于target,整个matrix都大于target
        if (row == matrix.begin()) {
            return false;
        }
        // 上一行可能有target
        --row;
        // stl 二分
        return binary_search(row->begin(), row->end(), target);
    }
};

在这里插入图片描述


http://www.kler.cn/a/108695.html

相关文章:

  • Java项目实战II基于微信小程序的个人行政复议在线预约系统微信小程序(开发文档+数据库+源码)
  • 在Flutter中,禁止侧滑的方法
  • Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化
  • 论软件维护及其应用子问题
  • JDBC-Dao层模式
  • 11.11比赛总结
  • 大数据之LibrA数据库常见术语(十)
  • Springmvc 讲解(1)
  • 嵌入式开发
  • Animate(原Flash)和木疙瘩中遮罩动画秒懂
  • 黑客在Pwn2Own Toronto上以58个零日漏洞赚取超过100万美元
  • dump与strace命令实战之分析keystore死锁导致watchdog问题
  • 正向代理和反向代理
  • 基于springboot实现校园疫情防控系统项目【项目源码+论文说明】计算机毕业设计
  • 【多线程面试题 八】、说一说Java同步机制中的wait和notify
  • 如何借助数据集更好的评估NLP模型的性能?
  • 【数据结构】数组和字符串(九):稀疏矩阵的链接存储:十字链表的插入、查找、删除操作
  • 大数据可视化BI分析工具Apache Superset实现公网远程访问
  • 【数据结构】Map和Set
  • 深入浅出排序算法之基数排序
  • OS的Alarm定时器调度机制
  • oracle,CLOB转XML内存不足,ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE“,
  • Think-Queue3一直提示[Exception]redis扩展未安装
  • 开源B2B网站电子商务平台源码下载搭建 实现高效交易的桥梁
  • Kotlin数据流概览
  • server2012 通过防火墙开启局域网内限定IP进行远程桌面连接