剑指offer算法题做题笔记

29次阅读

共计 896 个字符,预计需要花费 3 分钟才能阅读完成。

题目描述

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

解题思路

由题目可知,该数组具备以下性质:从左到右升序,从上到下升序。把二维数组看成矩阵形式的话,也就是说每个元素比左边的元素大,比右边的元素小,比上边的元素大,比下边的元素下。因此可以得到这么一个结论:当整数 A 大于该数组中的元素 B 时,那么 A 必然不在 B 的上方,也不在 B 的左方,只需往 B 的下方和右方查找即可;当整数 A 小于该数组中的元素 B 时,那么 A 必然不在 B 的下方和右方,只需往 B 的上方和左方查找即可。
既然知道了数组的这个性质,那么该如何应用它呢?以下图为例,假如要寻找的数是 n,试一下从左上角第一个元素 1 开始搜索,如果 n 比 1 大,可以得到结论:如果数组内存在 n 的话,他必然在 1 的右方或下方,往这两个方向搜索即可。但是这个结论并不能帮助我们,因为有两个搜索方向,不知道选哪个。但是从左下角和右上角两个地方开始就不一样了,以左下角为例,假如 n 大于左下角的元素 7,那么根据数组的性质,n 也大于 7 上边和左边的所有元素,7 是左下角的元素,只有上方有元素,因此可以排除 7 上方所有的元素,既第一列的所有元素都可以排除掉;假如 n 小于 7, 那么由于 7 右边的所有元素都比 7 小,那么 n 必然比这些元素小,所以这一列的所有元素也都可以排除。可以发现,不管 n 比 7 大也好,比 7 小也好,都可以直接排除掉 1 行或 1 列的元素,因此最坏情况下的时间复杂度是 m +n。

代码

`

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

}`

正文完
 0