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

剑指offer刷题笔记1(Python)

题目描述

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

思路

由于这是一个二维数组,且从行的角度来看,从左到右依次增加,即同一行右边的比左边的要大;从列的角度来看从上到下依次递增,即同一列下边的值要比上边的值要大。因此,有两种思考的角度:第一,是从整个二维数组的右上角出发,找到二维数组左上角的值,要寻找的整数如果比当前的数组中的值要,就往左移动一个位置(行);如果要找的整数比当前的数组中的值要,那么就往下移动(列)。第二,是从数组的左下角出发,大了往左,小了往右。

代码

下面,从右上角的角度来编写代码。

class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        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

ps: 这是我第一次写博客,特别激动。如果有错误的话,请指正,谢谢大家~~~

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/89791816
今日推荐