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

来源:互联网 发布:网络本科可以继续考研 编辑:程序博客网 时间:2024/05/29 19:15

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

public class Solution {    public boolean Find(int target, int [][] array) {       if (array == null || array.length == 0 || (array.length == 1 && array[0].length == 0))           return false;       int a = array.length;       int b = array[0].length;       for(int i = 0; i<a; i++){           if(target>=array[i][0]){ //只要target不小于某行数组的第一个值,即开始进入for循环查找               for(int j = 0; j<b; j++){                   if(target==array[i][j])                       return true;               }           }       }        return false;    }}

自己的思路有两个注意的地方:
1. 二维数组行数和列数的计算
2. 二维数组为空的判断。null和空数组是不一样的。有一个测试用例“16,[[]]”,有行,但列数为0

其实这种思路,相当于直接遍历了,代码还没有直接遍历来的简单。。。但复杂度和直接遍历基本一样

====
利用数组的特点,从左下角或者右上角开始查找,可以快速缩小范围

public class Solution {    public boolean Find(int [][] array,int target) {        int m = array.length - 1;        int i = 0;        while(m >= 0 && i < array[0].length){            if(array[m][i] > target)                m--;            else if(array[m][i] < target)                i++;            else                return true;        }        return false;    }}
原创粉丝点击