【Python学习-列表-类-循环】【剑指offer】之二维数组中的查找

【Python学习-列表-类-循环】【剑指offer】之二维数组中的查找

基础知识

Python中关于数组及len的操作详情可参考linklink

二维数组中的查找

题目:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
分析:
输入:二维数组array 整数 target

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here

在进行作答时,已经创建好了类及输入的二维数组array及整数target,那么解题思路分析:

暴力方法:遍历二维数组每一个元素,最后找是否有该整数。

思路二:因为题目明确说了二维数组的每一行是从左到右递增,每一列从上到下递增,如果想减少暴力方法每个都遍历一次的次数,那么就需要利用到这种独特的递增顺序,遍历可以从左下角或者右上角开始遍历,从左下角开始,如果整数比他大,则向右移动(右边数组的数会增大),再次进行比较,如果整数比他小,则向上移动(上边数组的数会减小),就像猜数游戏一样,告诉你是大了还是小了,最后找到正确的数。

暴力法代码:
复杂度最高

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        if not array:
            return 
        row=len(array)  # 列[[1, 2, 3], [4, 5, 6]]
        col=len(array[0]) # 行
        for i in range(row):
            for j in range(col):
                if array[i][j]==target:
                    return True
        return False

思路二代码:
每次从右和上选一个。

# -*- 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

测试

以上代码均为写好的类,下面创建对象来测试代码:

# -*- 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 print(True)
        return print(False)

shuru = Solution()  #创建对象1
shuru.Find(0, [[1, 2, 3], [3, 4, 9]])   # 调用对象功能
shuru1 = Solution() #创建对象2
shuru1.Find(2, [[1, 2, 3], [3, 4, 9]])

打印:

False
True

结果

比较一下两种方法的时间和内存
暴力方法:
在这里插入图片描述
思路二:
在这里插入图片描述

c++版本

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        // array是二维数组,这里没做判空操作
        int rows = array.size();
        int cols = array[0].size();
        int i=rows-1,j=0;//左下角元素坐标
        while(i>=0 && j<cols){//使其不超出数组范围
            if(target<array[i][j])
                i--;//查找的元素较少,往上找
            else if(target>array[i][j])
                j++;//查找元素较大,往右找
            else
                return true;//找到
        }
        return false;
    }
};

结果:
在这里插入图片描述
竖起大拇指!
具体更多参考信息可以参考link
刚开始学,Python基本的学完了,开始刷编程题。冲鸭!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值