专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
于小戈  ·  前顶流小花,被爆做三?! ·  昨天  
莓辣MAYLOVE  ·  为什么说和喜欢的人睡觉是大补? ·  2 天前  
槽值  ·  杀疯了的“三亚平替”,挤满东北人 ·  2 天前  
槽值  ·  网易沸点工作室多岗位实习生招聘中 ·  2 天前  
于小戈  ·  某影后,新恋情太争气! ·  3 天前  
51好读  ›  专栏  ›  吴师兄学算法

图解「剑指Offer」之二维数组中的查找

吴师兄学算法  · 公众号  ·  · 2019-09-08 12:20

正文

点击蓝色“ 五分钟学算法 ”关注我哟

加个“ 星标 ”,天天中午 12:15,一起学算法

作者 | 程序员小吴

来源 | 五分钟学算法

题目描述

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

编写一个高效的算法来搜索 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 = 0) {
      //如果目标值小于右上角的数字,则列下标减一
      if (target       //如果目标值大于右上角的数字,则行下标加一
      else if (target > array[i][j]) i++;
      //如果相等,直接 true
      else return






请到「今天看啥」查看全文