[LeetCode] 74. Search a 2D Matrix

Problems:
https://leetcode.com/problems/search-a-2d-matrix/

Solution1:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
    	// 矩阵为空,需要注意的是depth和width都需要判断
        if(matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        
        // 将target和每行左右两端值进行比较
        //1. target大于最右,则进入下一depth
        //2. target小于最左,则从上一depth中寻找
        int depth = matrix.length;
        int width = matrix[0].length;
        for (int d = 0; d < depth; d++) {
            if(matrix[d][width-1] < target) {
                continue;
            } else if(matrix[d][0] > target) {
                break;
            } else {
                for(int w = 0; w < width; w++) {
                    if(matrix[d][w] == target) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

TC: O(m+n)
SC: O(1)
Comments:难得自己写出来了一个medium,开心!

Solution2:
官方解法:binary search
将矩阵按行输出,就是一个sorted array,寻找target可以采用binary search的办法,需要处理的点在于如何定位矩阵中“中点”的坐标

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // binary search
        if(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 midEle = matrix[mid / n][mid % n]; // 妙点在于如何将mid位置转化成矩阵中的点
            if (midEle == target) {
                return true;
            } else if (midEle < target) {
                start = mid + 1;
            } else {
                end = mid - 1;//注意此处mid-1保证了不会存在start == end进而无限循环的情况
            }
        }
        return false;
    }
}

TC: O(logmn)
SC: O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值