题目描述

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

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。

  • 每列的元素从上到下升序排列。

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  71115],
  [2,   5,  81219],
  [3,   6,  91622],
  [1013141724],
  [1821232630]
]

给定 target = 5,目标值 5 在这个数组中,返回 true 即可。

给定 target = 20,目标值 20 不在这个数组中,需要返回 false

题目分析

这个二维数组是有特点的:

  • 每一行都是递增

  • 每一列都是递增

首先,我们初始化一个指向矩阵右上角的 元素 。

从这个元素开始查找,如果这个元素比 target 大,则说明需要找更小的,往左走;如果这个元素比 target 小,则说明应该找更大的,往下走。

动画演示


代码实现

//@author:程序员小吴
public class Solution {
  public boolean Find(int target, int [][] array) {
    //边界条件判断
    if (array == null || array.length == 0 ||
      array[0] == null || array[0].length == 0)
      return false;
    //获取函数矩阵的行数 m 与列数 n
    int m = array.length, n = array[0].length;
    //初始化一开始的元素位置,这里我们设置为矩阵最右上角的元素
    int i = 0, j = n - 1;
    //循环遍历整个函数
    while (i < m && j >= 0) {
      //如果目标值小于右上角的数字,则列下标减一
      if (target < array[i][j]) j--;
      //如果目标值大于右上角的数字,则行下标加一
      else if (target > array[i][j]) i++;
      //如果相等,直接 true
      else return true;
    }
    //循环结束后如果还没有找到目标时,返回 false
    return false;
  }
 }

复杂度分析

  • 时间复杂度:O(n+m) 。在循环语句中,除非直接返回结果,否则每一次行都会递减一次或者列都会递增一次。该矩阵共有 m 行 n 列,因此循环终止之前,循环不会运行超过 n+m 次。其它的操作都是常数,所以总的时间复杂度是线性的。

  • 空间复杂度:O(1)。没有使用额外的存储空间,所以它的内存占用是恒定的。

本题知识点

查找、数组



©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Python:2D Numpy数组(矩阵) - 查找负数之和(行)
  2. 数组与矩阵---需要排序的最短子数组长度
  3. python 按位置关系输出矩阵元素
  4. 显示一个矩阵,将一个共同因素放在同情中
  5. 矩阵类的python实现
  6. leet240. 搜索二维矩阵 II

随机推荐

  1. JavaWeb-1-IOS或Android客户端上传图片到
  2. 使用超类中的构造函数
  3. execl中设置的格式无法实现
  4. Java ThreadPoolExecutor 线程池调度器
  5. C/C++比java效率高的原因?
  6. 新手求教RandomAccessFile读写文件到底写
  7. Java中double型数组的HashCode产生
  8. 【java工具类】网站安全---将特殊字符编
  9. mvn依赖的jar,在项目中无法引用,求大神指点
  10. javascript(六)js事件绑定浏览器兼容解决方