劍指Offer積累-JZ1-二維陣列中的查詢

chuli666發表於2020-11-22

劍指Offer積累-JZ1-二維陣列中的查詢

為了提升個人能力,開始積累演算法,從劍指Offer開始。


以下是自己做的筆記&記錄,歡迎提出意見或指正錯誤。

題目描述

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

示例1
輸入
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true

方法一:順序查詢

暴力法,遍歷所有元素,直到找到為止。時間複雜度較高o(n*n)

# -*- coding:utf-8 -*-
class Solution:
#     python語言:純物件導向:
#     三個特性:封裝,繼承,多型
# python好處:方法庫特別多
    # array 二維列表
    def Find(self, target, array):
        # write code here
        for i in array:
            for j in i:
                if target == j:
                    return True
        else:
            return False
                
#     array = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
#     target = 7
#     status = Find(target, array)

方法二:二分查詢

在二維陣列中選擇合適位置開始查詢,因為陣列按序排列,可從左下(或右上)開始查詢,大於目標值,刪除一行(列);小於目標值,刪除一列(行)。此例如下圖:
左下
右上
第一種程式碼思路(右上)

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self, target, array):
            # array 二維列表
#len()函式
#1:作用:返回字串、列表、字典、元組等長度
#2:語法:len(str)
#3:引數:str:要計算的字串、列表、字典、元組等
#4:返回值:字串、列表、字典、元組等元素的長度
#5:例項  5.1、計算字串的長度:5.2、計算列表的元素個數:5.3、計算字典的總長度(即鍵值對總數):5.4、計算元組元素個數:

        row = len(array)
        col = len(array[0])
        i = 0
        j = col - 1
        while i < row and j >= 0:    #給出不能越界的條件
            if target == array[i][j]:
                return True
            elif target < array[i][j]:
                j = j - 1
            else:
                i = i + 1
        return False  



第二種程式碼思路(左下)

# -*- coding:utf-8 -*-
class Solution:
    # array 二維列表
    def Find(self,target, array):
        # write code here
        if array and array[0]:
            raw = len(array) - 1
            col = 0
            while target != array[raw][col]:#不等於就要判斷刪除行列;等於,迴圈條件不滿足直接跳出,返回true
                if target > array[raw][col]:
                    col += 1
                    if col >= len(array[0]):#判斷是否超過陣列長度
                        return 0
                if target < array[raw][col]:
                    raw -= 1
                    if raw < 0:#判斷是否超過陣列長度
                        return 0
            return 1
        else:
            return 0

這兩種方法迴圈和判斷邏輯有一些差別,有運算選第一種思路,有列表選第二種思路。
【程式碼優化思路:佔用最少空間,縮短時間。減少空間,少定義變數;縮短時間,減少迴圈 while 和 for】

相關文章