LeetCode 78 Search a 2D Matrix

本文介绍了一种高效的搜索算法,用于在一特殊类型的二维矩阵中查找指定数值。该矩阵每一行的整数从左到右递增排序,并且每行的第一个整数大于前一行的最后一个整数。文章提供了两种实现方式:迭代法和递归法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
Given target = 3, return true.

分析:

二分查找,关键在于怎么在二维数组上面进行一维二分查找。

长度为 m*n

mid元素是matrix[mid/n][mid%n]

这样就可以进行二分了。

public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        //检查参数
        if(matrix==null || matrix.length==0 || matrix[0].length==0)
            return false;
        int m = matrix.length;
        int n = matrix[0].length;
        //将矩阵转化成一维数组进行二分
        int start = 0;
        int end = m*n-1;
        while(start <= end){
            int mid = (start+end)/2;
            int val = matrix[mid/n][mid%n];//这行是关键
            if(val == target)
                return true;
            else if(val < target)
                start = mid+1;
            else
                end = mid-1;
        }
        return false;
    }
}

递归风格

public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix==null || matrix.length==0 || matrix[0].length==0)
            return false;
        int m = matrix.length;
        int n= matrix[0].length;
        return searchMatrix(matrix, target, 0, m*n-1);
    }
    
    public boolean searchMatrix(int[][] matrix, int target, int start, int end){
        if(start > end)
            return false;
        int mid = (start+end)/2;
        int x = mid/matrix[0].length;
        int y = mid%matrix[0].length;//这两行是关键
        if(matrix[x][y]==target)
            return true;
        if(matrix[x][y] < target)
            return searchMatrix(matrix, target, mid+1, end);
        else
            return searchMatrix(matrix, target, start, mid-1);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值