剑指Offer刷题记录,第二题。

剑指 Offer 04. 二维数组中的查找(medium)


方法一:二分法+双指针

思路:观察可知,左下角的数组值是其所在行最小值且为所在列最大值,于是有:
(1) 如果 左下角元素大于目标值,则目标值一定位于该行的上方, 左下角元素所在行可以消除。
(2) 如果 左下角元素小于目标值,则目标值一定位于该列的右方, 左下角元素所在列可以消除。
注:其实从左下角和右上角开始走,都是相同的思路。

class Solution {
   
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
   
        // 特例
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
    // 当数组不存在,或为空时,直接返回false。
            return false;
        }
        // 二分查找
        int n = matrix.length, m = matrix[0].length; // 行标和列表
        int i = n - 1, j = 0; // 从左下角开始遍历
        while (i >= 0 && j < m) {
   
            if (matrix[i][j] > target) {
    // 当前值大于目标值,则说明当前值所在行都大于目标值,因此,需要消除该行。
                i -= 1;
            }else if (matrix[i][j] < target) {
    // 当前值小于目标值,则说明当前值所在列都小于目标值,因此,需要消除该列。
                j += 1;
            }else{
    // 查找到目标值,返回true。
                return true;
            }
        }
        return false; // 未找到目标值,返回false。
    }
}

时间复杂度:O(M + N), N和M分别为数组行数和列数,该算法最多循环M + N 次。
空间复杂度:O(1), 未使用额外空间。

全部评论

相关推荐

07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-18 18:23
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务