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)。
相关推荐
wuweijianlove13 分钟前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong22 分钟前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志22 分钟前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光1 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_111 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg1 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒2 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾2 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士2 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法