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

剑指 Offer 04. 二维数组中的查找
题目描述

在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

0 <= n <= 1000
0 <= m <= 1000

解法

1.暴力for循环 时间复杂度O(n*m) 空间复杂度O(1) 不推荐

2.n行分别进行二分查找 时间复杂度O(nlogm) 空间复杂度O(1) 优于第一种

3.模拟一个初始结点从数组的左下角开始,当要找的数大于该结点时结点往右边移动一下,当要找的数小于该结点时将结点往上移动一下。重复直到得出结果。 时间复杂度O(n + m) 空间复杂度O(1)

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        //注意到题目给出的n与m的范围,要进行边界处理
        if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0){
            return false;
        }

        int rows = matrix.length - 1;
        int x = matrix[0].length - 1;    //记录行的定值
        int cols = matrix[0].length - 1;
        while (rows >=0 && cols >=0){
            if (target < matrix[rows][x - cols]){
                rows--;
            }else if (target > matrix[rows][x - cols]){
                cols--;
            }else {
                return true;
            }
        }
        return false;
    }
}
posted @   Q1uuuu  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示