《剑指offer练习笔记_01》

好久不见. 提交于 2020-02-05 01:43:50

题目描述

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

1.暴力法

依次遍历数组中的每一个数,若找到,则返回true;查找失败,则返回false。

//暴力法
public class Solution {
    public boolean Find(int target, int [][] array) {
        for(int i=0;i<array.length;i++)
        {
            for(int j=0;j<array[0].length;j++)
            {
                if(array[i][j]==target)
                {
                    return true;
                }
            }
        }
        return false;
    }
}

时间复杂度:O(n2)

2. 从边角开始查找

有左上、左下、右上、右下四个角。a是最大值,l是最小值。
在这里插入图片描述

(1)左上/右下

以左上为例,比较 a 与 target,若:

  • a > target, 则target不存在,返回false。
  • a < target, 则继续遍历查找。
  • a = target, 则查找成功,返回true。

右下同理,此方法相较于暴力法并无太多的改进。时间复杂度仍然为O(n2)

(2)左下/右上

以左下为例,可知左下值为最后一行的最小值且为第一列的最大值
因此,比较j与target,若:

  • j > target,则只需要查找该一行即可,列数增加。
  • j < target,则需要向上移动一行,行数减少。
  • j = target,查找成功,返回true。

此方法,每次比较都可剔除一行/一列,相较于以上,该方法的时间复杂度为O(行数+列数)

//从左下开始
public class Solution {
    public boolean Find(int target, int [][] array) {
        int row_length=array.length;
        int col_length=array[0].length;
        int col=0;
        int row=row_length-1;
        while(col<col_length && row>=0)
        {
            if(array[row][col]<target)
            {
                col++;
            }
            else if(array[row][col]>target)
            {
                row--;
            }
            else
            {
                return true;
            }            
        }
        return false;
    }
}

总结

一个小的点:Java获取二维数组行列长度

  • 获取行数 rowLength = array.length
  • 获取列列 colLength = array[0].length
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!