1. 二维数组中的查找

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。java

 

解题思路数组

要求时间复杂度 O(M + N),空间复杂度 O(1)。测试

特性:该二维数组中的一个数,它左边的数都比它小,下边的数都比它大。指针


 

利用二维数组由上到下,由左到右递增的规律,code

那么选取右上角或者左下角的元素a[row][col]与target进行比较,blog

当target小于元素a[row][col]时,那么target一定在元素a所在行的左边,排序

即col--;get

当target大于元素a[row][col]时,那么target一定在元素a所在列的下边,io

即row++;class

所以,从右上角开始查找,就能够根据 目标和当前元素的大小关系来缩小查找区间。

1. 若是数字 = 须要查找的数字,则查找过程结束。

2. 该位置的数字 < 须要查找的数字,须要向下 or 向右查找(不须要了)。

3. 该位置的数字 > 须要查找的数字,须要向左 or 向上查找(不须要,由于是右上角)

------------------------------------------------------------------------------------------------------------------------------------------------

|| 是或者的意思,只要有一个是 true ,就为 true 。

二维数组的长度:数组名.length ---每一个一维数组:数组名[下标].length

&& 两个都是true ,则是true

 

public class Solution {
    public boolean Find(int target, int [][] array) {
          if(array == null || array.length == 0 || array[0].length == 0)  //考察边界,二维数组为null,长宽都是 0 ,返回 false
              return false;
        int rows = array.length,cols = array[0].length; //rows cols 是行,列。
        int r = 0,c = cols - 1;//右上角开始
        while(r<=rows-1 && c >=0){    //若是r<二维数组的长,c > 0 ,一直循环
            if(target == array[r][c])
                return true;
            else if(target > array[r][c]) //当target大于元素a[row][col]时,那么target一定在元素a所在列的下边,即row++;
                r++;
            else          //当target小于元素a[row][col]时,那么target一定在元素a所在行的左边,即col--;
                c--;          
        }
        return false;
    }
}

测试用例:

最值考察

二维数组中无该数字

空指针

相关文章
相关标签/搜索