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)。
相关推荐
阿群今天学习了吗3 小时前
“鱼书”深度学习进阶笔记(3)第四章
人工智能·笔记·python·深度学习·算法
IT猿手3 小时前
2025年最新原创多目标算法:多目标酶作用优化算法(MOEAO)求解MaF1-MaF15及工程应用---盘式制动器设计,提供完整MATLAB代码
算法·数学建模·matlab·多目标优化算法·多目标算法
文弱_书生4 小时前
为什么神经网络的权重矩阵具有低秩特性?如何理解和解释?
人工智能·神经网络·矩阵
数据智能老司机6 小时前
图算法趣味学——最大流算法
数据结构·算法·云计算
秋难降7 小时前
【数据结构与算法】———深度优先:“死磕 + 回头” 的艺术
数据结构·python·算法
数据智能老司机7 小时前
图算法趣味学——图着色
数据结构·算法·云计算
数据智能老司机7 小时前
图算法趣味学——启发式引导搜索
数据结构·算法·云计算
John.Lewis8 小时前
数据结构初阶(8)二叉树的顺序结构 && 堆
c语言·数据结构·算法
SimonSkywalke8 小时前
基于知识图谱增强的RAG系统阅读笔记(七)GraphRAG实现(基于小说诛仙)(一)
算法
再睡一夏就好9 小时前
【排序算法】④堆排序
c语言·数据结构·c++·笔记·算法·排序算法