74.搜索二维矩阵

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

示例 1:

复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

代码:

复制代码
/*将矩阵看成一个有序的一维数组使用二分法,例如示例一可以看成[1,3,5,7,10,11,16,20,23,30,36,40]  二分法是向下取整 */

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
    int m = matrixSize,n = matrixColSize[0];
    if(m==0 || n==0){
        return false;  //行或者列为0则是空矩阵,返回false
    }
    int l = 0,r = m*n-1;
    while(l<=r){
        int mid = l + (r-l)/2;
        int hang = mid/n;  //除法得到行
        int lie = mid%n;   //取余得到列
        if(matrix[hang][lie]==target){
            return true;
        }else if(matrix[hang][lie]>target){  //二分法
            r = mid-1;
        }else{
            l = mid+1;
        }
    }
    return false;
}

补充:

数学推导:如何从一维索引反推二维坐标?

以示例一来计算

[1,3,5,7,10,11,16,20,23,30,36,40]

对于任意一维索引 mid(范围 0 到 行×列-1),我们要找到对应的二维坐标 (hang, lie)

  1. 行号 的计算

    • 每一行有 n 个元素,因此 mid 所在的行号等于 mid 除以 lie 的整数部分
    • 例如:
      • mid = 1 时,1 ÷ 4 = 01,说明 mid 在第 0 行(从 0 开始计数)。
      • mid = 8 时,8 ÷ 4 = 20,说明 mid 在第 2 行。
  2. 列号 col 的计算

    • mid 除以 n余数即为列号。
    • 例如:
      • mid = 1 时,余数为 1,说明 mid 在第 1 行的第 1 列(对应二维矩阵中的元素 3)。
      • mid = 8 时,余数为 0,说明 mid 在第 2 行的第 0 列(对应元素 23)。
相关推荐
renhongxia110 分钟前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了10 分钟前
数据结构之树(Java实现)
java·算法
算法备案代理13 分钟前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.37 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久1 小时前
【初阶数据结构01】——顺序表专题
数据结构
野犬寒鸦2 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总2 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68892 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
Zfox_2 小时前
CANN Catlass 算子模板库深度解析:高性能矩阵乘(GEMM)原理、融合优化与模板化开发实践
线性代数·矩阵
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先