(剑指offer python)二维数组中的查找

题目 二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

解题思路

Python中没有数组的概念,在此用list类型来表示数组,二维数组可以用二维列表来表示。对于一个二维列表array,array[0]表示第一行,len(array)表示行数,len(array[0])则表示列数。
例如一个二维列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

思路1:

对于题目描述中的二维数组,其实是由4个一维数组组成。首先第一个循环,对二维列表进行遍历,每次取出一个数组;其次第二个循环,对取出的一维数组中的元素进行遍历,判断单个元素是否和目标查找值相等。虽然可以实现题目的要求,但是没有用到题目中一些的条件,比如:每行每列递增。

实现

class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        for row in range(len(array)):
            arr = array[row]
            # 对于每一行(一维数组),在这个一维数组中查找target。
            for index in range(len(array[0])):
                if arr[index] == target:
                    return True
        return False

思路2

二维数组的行越右越大,列越下越大。 分析这个问题,首先吧二维数组画成矩形,然后从数组中选取右上角的数字9。由于9大于7,并且9还是第4列的第一个数字。因此7不可能出现在数字9所在的列。我们可以把这一列从需要考虑的区域内剔除,之后只需要分析剩下的3列。如图a。在剩下的矩阵中,位于右上角的数字是8。同样8大于7,因此8所在的列也可以剔除。接下来只要分析剩下的两列即可。如图b
在剩下的两列组成的数组中,2位于数组的右上角,2小于7,那么要查找的7可能在2的右边,也可能在2的下边。在前面的步骤中,2右边的列已经被剔除,也就是说7不可能出现在2的右边,因此7只有可能出现在2的下边。于是我们把数字2所在的行也剔除,只分析剩下的三行两列的数字。如图c。
剩下的数字中,4位于右上角,和前面一样,4所在的行也剔除,最后剩下两行两列。如图d。最后找到7。
规律:首先选取数组右上角的数字,如果数字等于要查找的数字,则查找结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。
这里写图片描述

实现

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # 主要思路:首先选取右上角的数字,如果该数字大于target,则该列全大于target,删除该列;
        # 如果该数字小于小于target,则该列全小于target,删除该行。
        found = False
        row = len(array)
        if row:
            col = len(array[0])
        else:
            col = 0

        if(row>0 and col>0):
            i = 0
            j = col - 1
            while(i<row and j>=0):
                if array[i][j] == target:
                    found = True
                    break
                elif array[i][j] > target:
                    j -= 1
                elif array[i][j] < target:
                    i += 1
        return found

猜你喜欢

转载自blog.csdn.net/weixin_37904412/article/details/80586267