• LeetCode 240. 搜索二维矩阵 II


    原题链接:

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

    题面:

    编写一个高效的算法来搜索 m x n 矩阵 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):

    1. bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    2. int m = matrixSize;
    3. int n = *matrixColSize;
    4. int row = 0;
    5. int col = n - 1;
    6. while (row < m && col >= 0) {
    7. if (matrix[row][col] == target) {
    8. return true;
    9. }
    10. if (matrix[row][col] > target) {
    11. col--;
    12. } else {
    13. row++;
    14. }
    15. }
    16. return false;
    17. }

  • 相关阅读:
    Vue 自定义指令绑定的处理函数中传递参数
    【算法04】二分法常见题型
    【JavaSE】如何简化Java的异常处理?try-with-resource语句的使用
    golang内存分析工具
    图像去雾易语言代码
    在线webp转换jpg免费转换教程
    go pprof 如何使用 --chatGPT
    基于JavaWeb的学生成绩管理系统
    每日leetcode[删除排序链表中的重复元素]
    想参加专转本,线上课怎样呀?
  • 原文地址:https://blog.csdn.net/qq_45554473/article/details/133552958