剑指offer——二维数组中的查找(从左下角开始比较)

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


解题思路:依题可知,该二维数组是一个从左到右,从上到下的一个有序数组,所以,当我们假设有一个N×N的矩阵时,左下角的值一定比它所在的行值都小,比它所在的列值都大。因此,我们将目标值target与该值进行比较。


1、当target大于该值时,则可以直接省略比较该值所在列的其他值;此时数组的比较范围则缩小为[N-1][N-2],此时左下角的值的坐标变为[N-1][1],然后继续与target比较;

2、当target小于该值时,则可以直接省略比较该值所在行的其他值;此时数组的比较范围则缩小为[N-2][N-1],此时左下角的值的坐标变为[N-2][0],然后继续与target比较;

3、当traget等于该值时,则直接返回即可。

4、第一轮比较过后,如果是1、2两种情况,则需要继续进行比较,此时依旧采用左下角的值与目标值target进行比较,以此类推,直至出现3的情况为止,这样比较过后,该二维数组的查找就结束啦。此时的时间复杂度为O(n),,这里是以一个矩阵为例。(PS:如果不是一个矩阵的数组,时间复杂度为O(n+m))

Java代码实现如下:

public class Solution{

    public boolean findNumberIn2DArray(int[][] matrix,int target){
    // 判断数组是否为空或者长度为0,
    if(matrix == null || matrix.length <= 0 || matrix[0].length <= 0){
        //若是的话,则返回false
        return false;
        }
    //定义一下数组的行cols
    int cols = matrix.length;
    //定义一下数组的列rows
    int rows = matrix[0].length;
    //定义左下角的坐标
    int col = cols - 1;
    int row = 0;

    //判断是否超过数组边界
    while(col >= 0 && row < rows){
        //如果target大于左下角的值,则右移
        if(target > matrix[col][row]){
            row++;
            }
        //如果target小于左下角的值,则上移
        else if(target < matrix[col][row]){
            col--;
            }
         //否则就是找到了target
        else{
            return true;
            }  
        }
      return false;
    }
}

本期总结:通过题干所给的信息,采用最优解的方法来实现功能,可以大大提高查找效率,希望本次解题思路有帮助你拓展思考方向,后期还会继续更新,望大家共同探讨共同进步!!!

你可能感兴趣的:(剑指offer刷题思路拓展精讲,算法,数据结构,leetcode,visual,studio,code,学习,intellij-idea)