【剑指Offer】JZ1二维数据的查找 Tag:[数组][查找]

以前都喜欢把自己的学习经历写在本地,今天听学长传授经验,决定开始写博客啦,最近在学算法,来上一道《剑指Offer》的题。🤭

JZ1 二维数据的查找

     tag:数组 查找

题目描述

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

示例
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true

解题思路:

在这里插入图片描述
可以注意到我在题目描述中加粗的两点,这个二维数组从左到右,从上到下都是由小到大递增的,这里我们可以利用二分思想,以右上角为初值来分析(左下角也可自行分析)

  1. 我们设初值 val = array[0][4],目标 target = array[2][1] 。
  2. 如图,我们可以看到 val 左边的值都是比它小的,val下面的值都是比它大的,我们可以利用这一点来进行二分操作。
  3. 二分操作:
  4. 如果 val == target ,则直接返回。
  5. 如果 val < target , 则说明 target 在更大的位置 ,而 val 左边的元素都小于 val,所以 val 左边的元素都小于 target。我们要寻找更大的值,因此 val 下移。
  6. 如果 val > target , 则说明 target 在更小的位置, 而 val 下面的元素都大于 val,所以 val 下面的元素都大于 target。我们要寻找更小的值,因此 val 左移。
  7. 重复二分操作

代码部分:

/**
 * @author baskbull
 * @since 2020-11-21
 */
public class Solution {
    public boolean Find(int target, int [][] array) {
        int rowSize = array[0].length;
        int lineSize = array.length;
        int i = 0;
        int j = rowSize-1;
        while(i<lineSize && j>=0){
            if (target == array[i][j]){
                return true;
            }
            else if(target > array[i][j]){
                ++i;
            }
            else {
                --j;
            }
        }
        return false;
    }
}

这种算法的时间复杂度为 O(array.length + array[0].length)
最坏的情况下,需要遍历 行数+列数次

方法还有许多,期待大家的补充啦😄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值