力扣 Hot 100 刷题记录 - 搜索二维矩阵 II

力扣 Hot 100 刷题记录 - 搜索二维矩阵 II(240)

题目描述

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

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

示例
输入: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

  • 如果 target = 5,返回 true
  • 如果 target = 20,返回 false

解题思路

方法一:二分查找

  • 思路:对每一行进行二分查找,时间复杂度为 O(m log n),其中 m 是行数,n 是列数。
  • 优点:实现简单。
  • 缺点:未充分利用矩阵的列有序特性。

方法二:Z 字形搜索

  • 思路:从矩阵的右上角(或左下角)开始搜索:
    • 如果当前值等于 target,返回 true
    • 如果当前值大于 target,向左移动一列。
    • 如果当前值小于 target,向下移动一行。
  • 时间复杂度O(m + n),其中 m 是行数,n 是列数。
  • 优点:充分利用矩阵的行列有序特性,效率更高。

代码实现

以下是 二分查找 的实现:

bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n=matrix.size();
        int m=matrix[0].size();
        int i=0;
        while(i<n&&matrix[i][0]<=target){
            int l=0,r=m-1;
            while(l<r){
                int mid=(l+r)/2;
                if(matrix[i][mid]>=target) r=mid;
                else l=mid+1;
                
            }
             cout<<l<<" ";
            if(matrix[i][l]==target){
                return true;

            }
            else{
                i++;
            }
        }
        return false;
    }
};

你可能感兴趣的:(leetcode,矩阵,算法)