74. 搜索二维矩阵

74. 搜索二维矩阵icon-default.png?t=M4ADhttps://leetcode.cn/problems/search-a-2d-matrix/

难度中等654

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

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

示例 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

通过次数235,450提交次数495,541

方法一:两次查找

一次列查找+一次行查找。

时间复杂度:列查找O(m) 行查找O(n) 总的时间复杂度O(m+n)

空间复杂度:O(1)

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int x=0;
        boolean flag = false;
        for(int i=0;i<matrix.length;i++)
        {
            // System.out.println(matrix[i][0]);
            if(matrix[i][0] <= target && matrix[i][matrix[i].length-1]>=target)
            {
                x=i; 
            } 
        }
        for(int i=0;i<matrix[0].length;i++)
        {
            if(matrix[x][i]==target) flag = true;
        }
        return flag;
    }
}

方法二:两次二分查找

一次列二分,一次行二分。

时间复杂度:列二分O(logm) 行二分O(logn) 总的时间复杂度:O(logmn)

空间复杂度:O(1)

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {

        //两次二分查找:一次列二分查找,一次行二分查找
        if(matrix[matrix.length-1][matrix[0].length-1]<target) return false;

        int start = 0;
        int end;
        int mid=0;

        //列二分
        end = matrix.length-1;
        while(start<=end)
        {
            mid = (end-start)/2+start;
            System.out.println(mid);
            if(matrix[mid][0]==target) return true;
            else if(matrix[mid][0]<target && (mid==matrix.length-1 || matrix[mid+1][0]>target)) break; 
            else if(matrix[mid][0]<target) start = mid+1;
            else end = mid-1;
        }

        int x = mid;
        //行二分
        start = 0;
        end = matrix[0].length-1;
        while(start<=end)
        {
            mid = (end-start)/2+start;
            if(matrix[x][mid]==target) return true;
            else if(matrix[x][mid]>target) end = mid-1;
            else start = mid+1;
        }
        return false;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值