【牛客】剑指Offer1——二维数组中的查找

方法一:暴力法

从左至右,从上至下依次查找,如果最终找到了目标数字则返回TRUE,否则返回FALSE。

 

方法二:线性查找之右上角标志数法

 

由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的部分元素。

 

从二维数组的右上角开始查找。

如果当前元素等于目标值,则返回TRUE;

如果当前元素大于目标值,则移到左边一列;

如果当前元素小于目标值,则移到下边一行。

 

可以证明这种方法不会错过目标值。

如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。

如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。

 

伪代码:

  • 若数组为空,则返回FALSE

  • 初始化行下标为0,列下标为二维数组的列数减1

  • 重复下列步骤,直到行下标或列下标超出边界

    • 获取当前下标位置的元素num

    • 如果num和target相等,返回TRUE

    • 如果num大于target,列下标减1

    • 如果num小于target,行下标加1

  • 循环体执行完毕仍未找到元素等于target,说明不存在这样的元素,返回FALSE

 

代码:

class Solution:
    def findNumberIn2DArray(self, matrix, target):
        """

        :param matrix: List[List[int]]
        :param target: int
        :return: bool
        """
        if len(matrix) ==0:
            return False
        if len(matrix[0]) == 0:
            return False
        row, col = 0, len(matrix[0])-1
        while row < len(matrix) and col >= 0:
            if matrix[row][col] > target:
                col -= 1
            elif matrix[row][col] < target:
                row += 1
            else:
                return True
        return False

 

方法三:线性查找之左下角标志数法

 

该方法与右上角标志数法有异曲同工之妙,但是这个方法可以不用判断数组是否为空。如果有空输入的话,行下标初始值row=-1,循环体不会执行,故会直接返回FALSE

 

伪代码:

  • 初始化行下标为二维数组的行数减1,列下标为0

  • 重复下列步骤,直到行下标或列下标超出边界

    • 获取当前下标位置的元素num

    • 如果num和target相等,返回TRUE

    • 如果num大于target,行下标减1

    • 如果num小于target,列下标加1

  • 循环体执行完毕仍未找到元素等于target,说明不存在这样的元素,返回FALSE

    

 

 

代码:

class Solution:
    def findNumberIn2DArray(self, matrix, target):
        """

        :param matrix: List[List[int]]
        :param target: int
        :return: bool
        """

        row, col = len(matrix)-1, 0
        while row >= 0 and col < len(matrix[0]):
            if matrix[row][col] > target:
                row -= 1
            elif matrix[row][col] < target:
                col += 1
            else:
                return True
        return False

 

 

 

Reference:

 

1.LeetCode题解

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值