Leetcode74. 搜索二维矩阵

2019-12-31  本文已影响0人  answerLDA

题目

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

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

示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false

代码与注释

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int n = matrix.length;
        int m = n<=0?0:matrix[0].length;
        //判断数组是否为0;判断是否在数组数值范围内
        if(n == 0|| m==0||matrix[0][0]>target || matrix[n-1][m-1]<target){
            return false;
        }
        int left = 0;
        int right = n-1;
        int mid;
        //二分查找法,找到相关的行
        while(right > left){
             mid = (left + right)/2;
             if(matrix[mid][0] == target){
                 return true;
             }else if(matrix[mid][0] > target){
                 right = mid -1;
             }else{
                 left = mid +1;
             }
        }
        //进行调整,获取所在的行
        int row = matrix[right][0]>target?right-1:right;
        left= 0;
        right = m-1;
        //用二分查找法获取target在所在列的具体位置
        while(right > left){
             mid = (left + right)/2;
             if(matrix[row][mid] == target){
                 return true;
             }else if(matrix[row][mid] > target){
                 right = mid -1;
             }else{
                 left = mid +1;
             }
        }
        //排除单列或者单行的情况
        return target == matrix[row][right];
    }
}
上一篇 下一篇

猜你喜欢

热点阅读