74. 搜索二维矩阵

导读:本篇文章讲解 74. 搜索二维矩阵,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

难度中等654

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

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

示例 1:

74. 搜索二维矩阵

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

74. 搜索二维矩阵

输入: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;
    }

}

74. 搜索二维矩阵

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69085.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!