LeetCode 240.搜索二维矩阵II

119 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目:现有一个二维矩阵,二维矩阵中每行的元素从左到右升序排列,每列的元素从上到下升序排列。现要求编写一个高效的算法来搜索二维矩阵中的目标值。

解题思路

可以使用暴力搜索法,如下:

public boolean searchMatrix(int[][] matrix, int target) {
    for(int i=0;i<matrix.length;i++){
        for(int j=0;j<matrix[0].length;j++){
            if(matrix[i][j] == target) return true;
        }
    }
    return false;
}

但显然此方法并不高效,时间复杂度为O(n2)O(n^2)

那么换种思路:按照常规的思路,我们从左到右先搜索第一行,如果找到了则直接返回true,如果第一行中找到了大于此元素的数字,则往后退一步再往下走,如果第一行所有元素都大于此元素,则直接向下一行走,接下来每行都这么判断,思路应该是没问题,但我代码没写出来!!!有些太绕了,而且情况很难讨论(是我菜!)。

于是屁颠屁颠跑去看答案了。

答案的Z字形搜索和我的思路一致,只不过它是从数组第一行的右边元素开始搜索,这样搜索的策略比从左向右常规搜索优秀了一大截,因为每行的元素都是递增的,我们很好判断接下来怎么走,而列方向也是一致的,可得如下代码:

public boolean searchMatrix3(int[][] matrix, int target) {
    int row = matrix.length, column = matrix[0].length;
    int i = 0, j = column-1;
    while(i<row&&j>=0){
        if(matrix[i][j]==target) return true;
        if(matrix[i][j]<target){
            i++;
        }else {
            j--;
        }
    }
    return false;
}

时间复杂度为O(m+n)O(m+n)。真的是米奇妙妙屋~