剑指offer——二维数组中的查找

发布时间:2024年01月19日

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

例子

输入一个数组:

num[3][4] = [

1 , 4 , 6 , 28 ,

2 , 7 , 32 , 30 ,

10 , 11 , 67 , 79

]

需要查找 一个数字 32,则返回 true。

思路及解法:

暴力破解

直接暴力遍历,但是在最坏的情况是遍历完所有的元素才能获取结果。如果这个数组规模是?n * m,那么时间复杂度就是?O(n × m),没有借助其他的空间,空间复杂度为?O(1)

比较查找法

但是我们换一种思路,我们选定左下角的?10?(?num[2][0], i = 2, j = 0?)作为起点,如果大于?10?,那么?i + 1?,如果小于?10?,则?j + 1?,则下一个查找的数字是?11?,我们知道?32?仍然比?11?大,则往右找到?67 ,继而?32?比?67?小,我们应该往上找,找到了?32?。
如果找 28?,则是最坏的结果,查找知道数组的右上角结束,这样一来,最坏的结果就是?O(n + m)

Java?实现代码如下:

public class Solution{
    public boolean Find(int target,int[][] array){
        int size = array.length;
        int length = array[0].length;
        int i,j;
        for(i = size - 1, j = 0 ;i >= 0 && i <size && j >= 0 && j < length;){
            if(array[i][j] == target){
                return true;
            }
            if(array[i][j] < target) {
                j++;
                continue;
            }
            if(array[i][j] > target){
                i--;
                continue;
            }
        }
        return false;
    }
}
       

文章来源:https://blog.csdn.net/qq_44774893/article/details/135668740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。