leetcode74(搜索二维矩阵)

题目描述

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

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

解法一

直接作为一维数组处理
索引和下标的对应关系为:
x=index/m
y=index%m

index
=x*m+y;

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int n=matrix.length,m=matrix[0].length;
        int l=-1,r=n*m;
        while(l+1!=r){
            int mid=(l+r)/2;
            int x=mid/m;
            int y=mid%m;
            if(matrix[x][y]>=target){
                r=x*m+y;
                if(matrix[x][y]==target) return true;
            }
            else l=x*m+y;
        }
        return false;
    }
}

解法二

和前面矩阵搜索解法一样
从右上角搜索
如果值小就下移
如果值大就左移
直到找到目标值或者数组越界

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int x = 0, y = matrix[0].length-1;
        while (true) {
            if (matrix[x][y] > target) {
                y--;
                if(y<0) return false;
            }
            if(matrix[x][y]==target) return true;
            if(matrix[x][y]<target){
                x++;
                if(x>=matrix.length) return false;
            }
        }
    }
}

解法三

官方第一种解法:
利用两次二分
第一次确定答案所在行数
第二次确定答案

class Solution {
    int[][] matrix;
    int target;
    public boolean searchMatrix(int[][] matrix, int target) {
        this.matrix=matrix;
        this.target=target;
        int row = binarySearchFirstColumn();
        if (row == -1)
            return false;
        return binarySearchRow(row);
    }

    public boolean binarySearchRow(int row) {
        int l = -1, r = matrix[0].length;
        while (l + 1 != r) {
            int mid = (l + r) / 2;
            if (matrix[row][mid] >= target) {
                r = mid;
                if (matrix[row][mid] == target)
                    return true;
            } else
                l = mid;
        }
        return false;
    }

    public int binarySearchFirstColumn() {
        int l=-1,r=matrix.length;
        while (l + 1 != r) {
            int mid = (l + r) / 2;
            if (matrix[mid][0] > target) {
                r = mid;
            } else
                l = mid;
        }
        return l;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值