zoukankan      html  css  js  c++  java
  • 剑指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
  • 相关阅读:
    【C++】虚函数
    ZF-net
    bzoj1061【NOI2008】志愿者招募
    highcharts 绘制图标的JAVASCRIPT 类库 收藏
    C语言中的const,free使用方法具体解释
    Java Transaction Management
    从有序数组中查找某个值 low_bound
    [华为机试练习题]35.找零钱
    1.9算法入门之进制转换
    uboot移植rtc
  • 原文地址:https://www.cnblogs.com/huanjing/p/8729413.html
Copyright © 2011-2022 走看看