剑指offer刷题笔记 - 二维数组的查找

这里写自定义目录标题

自己想的思路是比较target与矩阵中心值的大小,如果target大,则排除中心左上的1/4矩阵, 如果target小,则排除右下的1/4矩阵。 然后把剩下的3/4矩阵分割三份,recursively 调用函数查找三个矩阵。
代码如下:

import numpy as np
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        print(array)
        array = np.array(array)
        if array.size == 0:
            return False
        col_r = array.shape[0]
        row_r = array.shape[1]
        col_m = int((col_r-1)/2)
        row_m = int((row_r-1)/2)
        anchor = array[col_m, row_m]
        if target < anchor:
            return self.Find(target, array[:col_m,:row_m]) or\
             self.Find(target, array[col_m:col_r,:row_m]) or\
              self.Find(target, array[:col_m,row_m:row_r])
        elif target > anchor:
            return self.Find(target, array[col_m+1:col_r,row_m+1:row_r]) or\
             self.Find(target, array[col_m+1:col_r,:row_m+1]) or\
              self.Find(target, array[:col_m+1,row_m+1:row_r])
        else:
            return True

不过测试速度很低,因为是log(4/3, mn)的复杂度,矩阵大于44时速度就会慢于O(m+n). 故使用二分搜索从右上角搜索,代码如下:

class Solution(object):
    def findNumberIn2DArray(self, matrix, target):
        if len(matrix) == 0:
            return False
        r = len(matrix[0])-1
        t = 0
        max_c = len(matrix)
        while r >= 0 and t < max_c:
            anchor = matrix[t][r]
            if target == anchor:
                return True
            elif target > anchor:
                t+=1
            else:
                r-=1
        return False

此题还是比较简单,就是代码不够熟练,要注意空input矩阵的判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值