【剑指offer】[数组]二维数组中的查找

二维数组中的查找

题目描述

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

思路一

将数组的每一行视为一个新数组,进行二分法遍历
起始点start 中间点mid 结尾点end
当中间点值大于目标值,则结尾点移至中间点的前一个点,反之,起始点移至中间点后一个点
运行时间215ms 占用内存5836K

代码

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        h = len(array)
        for i in range(h):
            array_c = array[i]
            start = 0
            end = len(array_c)-1
            while start<=end:
                mid = int((start+end)/2)
                if target<array_c[mid]:
                    end = mid-1
                elif target>array_c[mid]:
                    start = mid+1
                else:
                    return True
        return False

思路二

从二维数组左下角开始遍历,当值小于target则行数减1,当值大于target则列数加1
运行时间330ms 占用内存 5716k

代码

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        l = len(array)
        h = l-1
        w = 0
        while h>=0 and w<len(array[h]):
            if target<array[h][w]:
                h-=1
            elif target>array[h][w]:
                w+=1
            else:
                return True
        return False

思路三

递归查找 运行时间:63ms占用内存:9604k

代码

# -*- coding:utf-8 -*-
class Solution:    
# array 二维列表    
    def Find(self, target, array):        
    # write code here        
        n=len(array)        
        flag='false'        
        for i in range(n):            
            if target in array[i]:                
            flag='true';                
            break        
        return flag
    while True:    
        try:        
            S=Solution()   
            # 字符串转为list  
            #eval() 函数用来执行一个字符串表达式,并返回表达式的值。
            #raw_input读取控制台的输入    
            L=list(eval(raw_input()))        
            array=L[1]        
            target=L[0]        
            print(S.Find(target, array))    
        except:        
            break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值