LeetCode 240. 搜索二维矩阵 II

原题链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题面:

编写一个高效的算法来搜索 m xn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

解题思路:

可以很容易想到,当数组中选取的数字小于要查找的数字,则根据该题二维数组的排序规则,我们要找的数字可能在当前选取位置的右边或者下边,同理,如果选取的数字大于要查找的数字,那么要查找的数字可能在当前选取位置的左边或者上边。

在以上分析中,由于要查找的数字相对于选取位置有可能在两个区域中出现,并且这两个区域还存在重叠,所以单纯的用这个规律进行搜索似乎是不太可行的,并不能十分有效的提高搜索效率。

我们考虑从右上角开始搜索,如果该数字等于要查找的数字,则结束查找。如果该数字大于要查找的数字,则这一列都不可能符合,所以排除这一列。如果该数字小于要查找的数字,那么按照规律我们应该往右或者往下,但是右边的列是已经被我们排除过的,所以往下,即将当前行也排除掉了。这样每一步都可以缩小查找的范围,直到找到要查找的数字或者查找范围为空。

时间复杂度为O(m+n),m为矩阵行数,n为矩阵列数。

空间复杂度为O(1)。

代码(C):

cpp 复制代码
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int m = matrixSize;
    int n = *matrixColSize;
    int row = 0;
    int col = n - 1;
    while (row < m && col >= 0) {
        if (matrix[row][col] == target) {
            return true;
        }
        if (matrix[row][col] > target) {
            col--;
        } else {
            row++;
        }
    }
    return false;
}
相关推荐
kkeeper~3 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6664 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964135 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚5 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本5 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov7 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫7 小时前
特征工程处理
人工智能·算法·机器学习
z落落7 小时前
C#参数区别
java·算法·c#
c238568 小时前
vector(下)
数据结构·算法
z落落8 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法