剑指offer-二维数组查找

观察数的规律,

1、数组在行和列的单调性,所以可以从行或者列的单项进行二分查找,复杂度为 n * log2m

2、例如在待查数(<mark>7</mark>)的交叉轴形成的两个矩形中形成的空间均是大于或者小于待查值,从左上向右下递增。所以可以沿着短边形成的正方形的对角线进行比较,考虑从左上或者右下进行。例从左上开始,1,小于目标值,然后比较行列对应的尾部是否大于目标值,大于则在该行(列)中遍历,1<7,且5<7,而9>7,所以遍历第一列即可。这个可以在原本n * m的基础上适当的减小一部分需要遍历的内容,单最终还是n * m的复杂度。

1 2 3 4 5
2 3 <mark>7</mark> 8 9
4 6 8 9 10
9 10 11 12 13

3、还有一种就是从左下或者右上开始查询。查询当前行,若等于目标值就返回True,若大于目标值则上跳一行。重新从第一列遍历到最后一列。所以从复杂度的考虑上依旧是n * m。

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        if len(array) == 0 or len(array[0]) == 0:
        	return False
        row = len(array)
        col = len(array[0])
        # 从左下角开始查找,若待查数小于当前值则上跳一行,大于当前值,则向右跳一行
        for i in range(row):
        	if target == array[row - i -1][0]:
        		return True
        	elif target < array[row - i -1][0]:
        		continue

        	for j in range(col):
        		if array[row - i - 1][j] == target:
        			return True
        		elif array[row - i - 1][j] > target:
        			break
        return False


# [[]] 这样的案例咩有考虑到。
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务