《LeetCode之每日一题》:12. 搜索二维矩阵

本文介绍了多种在有序二维矩阵中查找目标值的算法,包括暴力遍历、查找所在行优化、二分查找等方法,详细分析了它们的时间复杂度和空间复杂度,旨在提供高效解决方案。

搜索二维矩阵


题目链接: 搜索二维矩阵

有关题目

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。
该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

在这里插入图片描述
在这里插入图片描述

提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4

题解

1、暴力法

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
	int x,y;
	for (x = 0; x < matrixSize; x++)
	{
		for ( y = 0 ; y < * matrixColSize; y++)
		{
			if (matrix[x][y] == target)
				return true;
		}
	}
	//
	return false;
}

时间复杂度: O(M * N)
空间复杂度:O(1)
2、查找所在行1

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
   int i,j;
   for (i = 0; i < matrixSize; i++)
   {
       for(j = *matrixColSize - 1; j >= 0; j--)
       {
           if (matrix[i][j] < target)
                break;
            if (matrix[i][j] == target)
                return true;
       }
   }
        return false;
}

时间复杂度:O(M * N)
空间复杂度:O(1)
在这里插入图片描述

3、寻找到所在行2

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int y = *matrixColSize - 1;
    for (int i = 0; i < matrixSize; i++)
        {
            if (matrix[i][y] < target)
                continue;
            else if (matrix[i][y] == target)
                return true;
            else
                {
                    for (int j = y - 1; j >= 0; j--)
                    {
                        if (matrix[i][j] == target)
                            return true;
                    }
                }
                //行内使用二分查找
			//int right = y - 1;
            //        int left = 0;
            //        while(right >= left)
            //            {
             //               int mid = (left + right) / 2;
             //               if (matrix[i][mid] > target)
             //                   right = mid - 1;
             //               else if (matrix[i][mid] < target)
               //                 left = mid + 1;
              //              else
               //                 return true;
              //          }
        }
        return false;
}

时间复杂度: 在行中遍历查找的时间复杂度是: O(M + N);如果在行中进行二分查找的时间复杂度是则 O(M + log(N))
空间复杂度:O(1)
在这里插入图片描述

4、跟搜索二维矩阵 II相类似

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int x = 0;
    int y = *matrixColSize - 1;
    while(y >= 0 && x < matrixSize )
    {
        if (matrix[x][y] > target)
            y--;
        else if (matrix[x][y] < target)
            x++;
        else
            return true;
    }
        return false;
}

时间复杂度:O(M + N)
空间复杂度:O(1)
在这里插入图片描述
5、
两次二分查找

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int m = matrixSize;
    int n = *matrixColSize;
    //先查找行
    int l = 0;
    int r = m - 1;
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if (matrix[mid][0] <= target)
            l = mid;
        if (matrix[mid][0] > target)
            r = mid - 1;
    }
    //出来判断
    if (matrix[r][0] == target) return true;
    if (matrix[r][0] > target) return false;
    int row = r;
    //比较列
    l = 0;
    r = n - 1;
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if (matrix[row][mid] <= target)
            l = mid;
        if (matrix[row][mid] > target)
            r = mid - 1;
    }   
    int col = r;
    return matrix[row][col] == target;
}

时间复杂度:O(logM + logN)
空间复杂度:O(1)
在这里插入图片描述

6、全局查找的二分查找

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int m = matrixSize;
    int n = *matrixColSize;
    int l = 0;
    int r = m * n - 1;
    //这边其实也包含了
    //[1]
    //查找1这种情况,因为根本就进不去循环
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if (matrix[mid / n][mid % n] <= target)
            l = mid;
        if (matrix[mid / n][mid % n] > target)
            r = mid - 1;
    }
     return matrix[r / n][r % n] == target;
}

时间复杂度:O(log(M * N)
空间复杂度:O(1)
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值