二维数组中的查找

题意:

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

分析:

因为是有序数组,首先想到的是用二分查找,每次可以过滤掉不符合要求的一半,但是分割成四个象限后第一象限和第三象限的大小无法确定,有点费事,弃之。

后来参照网上比较好的一种写法:牛客

  1. 来看一下数据的特性:
  • 每一行都按照从左到右递增的顺序排序
  • 每一列都按照从上到下递增的顺序排序
  1. 翻译成自己的话:

左下角是该行最小的值,该列最大的值。

  1. 做题思路:

从左下角(假设左下角的数值为m)开始,用target与一行中的最小值与一列中的最大值进行比较,依次比较可以剔除一整行或一整列。

  • m > target:m已经是该行最小的值,想要更小的只能从行的角度考虑,故上移一行。
  • m < target:m已经是该列最大的值,想要更大的只能从列的角度考虑,故右移一列。
  • m = target:成功找到

代码:

def Find(target, array):
    rows = len(array)
    cols = len(array[0])
    
    if rows == 0 or cols == 0:#处理边界条件
        return False
    
    row = rows - 1, col = 0#从左下角开始比较
    while row >= 0 and col < cols: 
        if array[row][col] == target:
            return True
        elif array[row][col] > target:
            row -= 1
        else:
            col += 1
            
    return False
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容