剑指offer试题——二维数组的中查找
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
# -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here rows = len(array) - 1 cols= len(array[0]) - 1 i = rows j = 0 while j<=cols and i>=0: if target<array[i][j]: i -= 1 elif target>array[i][j]: j += 1 else: return True return False
算法思想;利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
本例中从左下角元素开始
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
即row--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
即col--;
当target等于元素a[row][col]时,那么return true
另外,理清代码中的逻辑
尤其注意python中if else 的用法https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431675624710bb20e9734ef343bbb4bd64bcd37d4b52000
if
添加一个else
语句,意思是,如果if
判断是False
,不要执行if
的内容,去把else
执行了以输入为例,
array=[[1,2,3],[4,5,6],[7,8,9]],target为0,
循环开始,i=2,j=0;
target小于array[2][0]=7,执行i-=1;退出if条件判断,来到while循环,此时,i=1,j=0,满足循环条件,再次进入循环
target=0小于array[1][0]=4,执行i-=1;退出if条件判断,来到while循环,此时,i=0,j=0,满足循环条件,再次进入循环
target=0小于array[0][0]=1,执行i-=1;退出if条件判断,来到while循环,此时,i=-1,j=0,满足循环条件,退出进入循环,return false,即0不存在在数组中
while外面的循环完成边界判断,结合if条件判断
array=[[1,2,3],[4,5,6],[7,8,9]],target为9,
循环开始,i=2,j=0;
target大于array[2][0]=7,执行j+=1;退出if条件判断,来到while循环,此时,i=2,j=1,满足循环条件,再次进入循环
target=9大于array[2][1]=8,执行j+=1;退出if条件判断,来到while循环,此时,i=2,j=2,满足循环条件,再次进入循环
target=9等于array[2][2]=9,if的条件都是false, 执行else语句
输入:
array=[[1,2,3],[4,5,6],[7,8,9]] a=Solution() a.Find(1,[array)
输出:
True
知识点:
类和实例
参考廖雪峰的官方网站-面向对象编程
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431864715651c99511036d884cf1b399e65ae0d27f7e000
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
在Python中,定义类是通过class
关键字:
class Student(object): pass
class
后面紧接着是类名,即Student
,类名通常是大写开头的单词,紧接着是(object)
,表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类。
定义好了Student
类,就可以根据Student
类创建出Student
的实例,创建实例是通过类名+()实现的:
输入:
bart=Student()
bart
输出:
<__main__.Student at 0x1db4ab08160>
变量bart
指向的就是一个Student
的实例,后面的
0x1db4ab08160
是内存地址,每个object的地址都不一样,而Student
本身则是一个类。
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
数据封装
class Student(object):#定义一个类,类中封装了两个函数,姓名分数写入函数和姓名分数打印函数 def get_score(self): self.name = input() #手动输入需要录入的人姓名,比如meimei self.score = int(input()) #输入分数 def print_score(self): print('%s: %s' % (self.name, self.score)) #打印刚刚输入的人分数
输入:
bart=Student()
bart.get_score()
bart.print_score()
输出:
meimei 95 meimei: 95