1. 程式人生 > >劍指offer - 二維陣列中的查詢

劍指offer - 二維陣列中的查詢

題目描述

在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。


方法1:

暴力破解,遍歷所有元素,比較得知是否含有目標元素,若有,則返回True,若不存在則在最後返回False。

時間複雜度  n * n

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
        # write code here
        width, height = len(array[0]), len(array)
        for i in range(width):
            for j in range(height):
                if array[i][j] == target:
                    return True
        return False
執行結果:

執行時間:436ms佔用記憶體:6004k


方法2:

把每一行看成有序陣列,利用二分查詢,遍歷每一行得到答案。時間複雜度 nlogn

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
        # write code here
        width, height = len(array[0]), len(array)
        for i in range(height):
            left, right = 0, width - 1
            while left <= right:
                mid = (left + right) // 2
                if array[i][mid] == target:
                    return True
                elif array[i][mid] > target:
                    right = mid - 1
                else:
                    left = mid + 1
        return False
執行結果:
執行時間:354ms,佔用記憶體:5856k


方法3:

利用二維陣列從上到下,從左到右遞增的規律,選取左下角(也可以是右上角)的元素Array[row][column]作為當前元素與target比較,當target小於當前元素時,target必定在當前元素所在列的上邊,即row-1,當target大於當前元素時,target必定在當前行的右面,即column+1。時間複雜度 n

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
        # write code here
        row, column = len(array) - 1, 0
        while row >= 0 and column < len(array[0]):
            current = array[row][column]
            if current == target:
                return True
            elif current < target:
                column += 1
            else:
                row -= 1
        return False
執行結果:

執行時間:287ms,佔用記憶體:5860k


方法4:

遍歷每一行,使用in判斷是否含有target。

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
        # write code here
        for i in range(len(array)):
            if target in array[i]:
                return True
        return False
執行結果:

執行時間:431ms,佔用記憶體:5760k