首页 > 编程语言 > 详细

[剑指offer] 1. 二维数组中的查找 (数组)

时间:2019-02-26 13:30:46      阅读:179      评论:0      收藏:0      [点我收藏+]

技术分享图片

注意是有序数组!!

思路:

1.利用二维数组由上到下,由左到右递增的规律,选取右上角或者左下角的元素a[m][n]与target进行比较,

当target小于元素a[m][n]时,那么target必定在元素a所在行的左边,即n-1;
当target大于元素a[m][n]时,那么target必定在元素a所在列的下边,即m+1;
# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        m=0 
        n=len(array[0])-1 #右上角开始判断
        while m<=len(array)-1 and n>=0:
            if array[m][n]>target:
                n-=1
            elif array[m][n]<target:
                m+=1
            else:
                return True
        return False

上述m,n的位置不能互换,否则无法通过,以右上角起始位置来判断。

不过花了295ms, 用java的<1ms !!!

 

2.把每一行看成有序递增的数组,利用二分查找,遍历每一行,时间复杂度是nlogn.

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

注意二分法中,在每行的循环中,再赋值low和high。

其次注意 千万不要漏掉条件:while low<=high:

但是速度还是很慢,最终耗时418ms。

[剑指offer] 1. 二维数组中的查找 (数组)

原文:https://www.cnblogs.com/nicetoseeyou/p/10436454.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!