美文网首页
剑指offer——面试题4:二维数组中的查找

剑指offer——面试题4:二维数组中的查找

作者: 金锡圭璧 | 来源:发表于2020-01-09 19:16 被阅读0次

1.题目描述:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。请完成一个函数,判断数组中是否包含指定的数字。

2.解题思路:

可以选择数组左下角的数字进行比较,因为如果要找的数字num比它小,则说明需要去它上边的一行去判断;如果要找的数字num比它大,则说明需要去它右边的一列去判断。事实上,也可以选择右上角的数字开始,但是不能选择左上角或者右下角,因为要保证所选数字的两条边一条在递增一条在递减,否则就不知道比较后该往哪里继续判断。

3.代码实现:

public class Offer_4 {
    public static void main(String[] args) {
        int[][] array = {
                {1, 2, 8, 9},
                {2, 4, 9, 2},
                {4, 7, 10, 13},
                {6, 8, 11, 15}
        };
        System.out.println(FindNum(array, 12));
    }

    private static boolean FindNum(int[][] array, int num) {
        if (array == null) {
            return false;
        }
        int x = array.length - 1;
        int y = 0;

        while (x >= 0 && y < array.length) {
            if (num > array[x][y]) {
                y++;
            } else if (num < array[x][y]) {
                x--;
            } else {
                return true;
            }
        }
        return false;
    }
}
复杂度分析:
  • 时间复杂度:O(n),对于大小为n x n的数组,最少时间是第一次就找到num;最大时间是num在所选的数字的对角位置,需要判断2n -1次,总的时间复杂度为O(n).
  • 空间复杂度:O(1),不需要额外开辟新的空间。

相关文章

网友评论

      本文标题:剑指offer——面试题4:二维数组中的查找

      本文链接:https://www.haomeiwen.com/subject/uyxuactx.html