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

注意是有序数组!!

思路:

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。

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