剑指offer:Python 二维数组中查找

题目描述

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

思路过程

'''
首先对二维数组要有一定的了解,Python中类似数组的数据结构是列表(list),
列表相对于数组来说,可以扩展(增加)和压缩(删减);
对于一个二维数组 array,通常表示为:array=[i][j] 前者是每一行,后者是每一列,
通过行和列,可以确定二维数组中的一个值。
'''

在这里插入图片描述

'''
回归题意:因为每一行最后一个数,是该行最大的;每一列最后一个数是也是最大的,
所以上图中:7应该是最大的数,相对于第一行最后一个4,是这一行最大的,但是4对应在列是最小的;
所以我们集中来研究“4”这个值 arrar[0][3] :
	当要找的值	如果 >4 那肯定不是在同一行
				如果 <4 那肯定不是在同一列
	那么我可以,通过判断来分别决定移动行和列
'''

Python实现

直接遍历法,时间复杂度O(n)=n*m 即是 O(n)=n^2

def Find(self, target, array): # 行 / 横
	for i in range(len(array)):
	            for j in range(len(array[i])): # 列 / 竖
	                if target==array[i][j]: # 两个位置来确定一个数
	                    return True
	        return False

优化后,时间复杂度O(n)=n

def find_num(target, array):
    if len(array) == 0:
        return False
	row_count = len(array) # 行数
	column_count = len(array[0]) # 列数
	
    i = 0  # 行 假设是第一行
    j = len(array[0]) - 1 # 第一行对应的列,下标是从0开始的
    value = array[i][j] # 选定的一个值
    while i < row_count and j >= 0: # 确定循环边界
        if target == value:
            return True
        elif target > value: # 肯定在下一行
            i += 1
        else:
            j -= 1 # 肯定在前一列
    return False


array = [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
print(find_num(3, array))
class Solution:
    def Find(self, target, array):
        nrow = len(array)  # 直接用len求二位数组的维度,返回的是这个数组有多少行。
        ncol = len(array[0])  # 如果想要求列的话,可以求数组中某一个行向量的维度。
        r = nrow - 1 # 由于Python中的维度是从零开始,因此,要在原来的维度上减去1
        c = ncol - 1  # 同上
        # 这里设置r,c变量是为了限制循环条件的时候方便
        flag = False # 设置标志变量,默认false
        # 由于是从右上角出发,因此第一个位置的维度是array[0][ncol-1]
        i = 0
        j = ncol -1
        while i <= r and j >= 0: # 循环终止的条件,行、列越界。
        	if array[i[[j] == target: # 如果当前的值等于要找的目标值,那么就修改flag为True,并终止循环
        		flag = True
        		break 
        	if array[i[[j] > target: # 如果当前的值大于target,即target如果存在的话应该,应该在当前值的左边。
        		j -= 1
        	if array[i[[j] < target: # 如果当前的值小于target,即target如果存在的话应该,应该在当前值的下边。
        		i += 1
        return flag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值