LeetCodeEasy- [インタビューの質問04. 2次元配列での検索]

n * mの2次元配列では、各行は左から右への昇順でソートされ、各列は上から下への昇順でソートされます。関数を完成させ、そのような2次元配列と整数を入力し、配列に整数が含まれているかどうかを判断してください。

例:

既存のマトリックスは次のとおりです。

[
  [1、4、7、11、15]、
  [2、5、8、12、19]、
  [3、6、9、16、22]、
  [10、13、14、17、24]、
  [ 18、21、23、26、30 ]
]
ターゲット= 5の場合、trueを返します。

target = 20の場合、falseを返します。

制限:

0 <= n <= 1000

0 <= m <= 1000

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。

アイデア1:暴力

 直接の2層円形ブルートフォース検索で十分であり、トラバース時にいくつかの最適化を行うようにソートされます。

時間の複雑さ:O(n * m)

スペースの複雑さ:O(1)

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == [] or matrix == [[]]:
            return False
        # 暴力
        max_j = len(matrix[0])
        i = 0
        j = 0
        while i < len(matrix) and matrix[i][0] <= target:
            j = 0
            while j < max_j:
                if matrix[i][j] == target:
                    return True
                if matrix[i][j] > target:
                    max_j = j 
                j += 1
            i += 1
        return False

アイデア2:線形検索の右上隅(または左下隅)

       アイデア1で使用された元の配列のソート情報は十分ではありません。右上隅から検索を開始することを検討できます。ターゲット値がそれよりも小さい場合、列の後ろの値は大きくなり、それを考慮する必要はありません。列を直接除外します。ターゲット値がそれよりも大きい場合、明らかに同じ行がそれよりも小さい場合、ジャンプする必要があります次の行はこの行を除外します;それらが等しい場合、検索は直接終了します。

        同様に、左下から検索を開始すると、操作の考え方は右上と同じです。

時間の複雑さ:O(n + m)

スペースの複雑さ:O(1)

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == [] or matrix == [[]]:
            return False
        # 线性查找: 右上角
        i = 0
        j = len(matrix[0]) - 1
        while i < len(matrix) and j >= 0:
            if target == matrix[i][j]:
                return True
            elif target > matrix[i][j]:
                i += 1
            else:
                j -= 1
        return False

 

公開された314元の記事 ウォン称賛22 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_39451578/article/details/105321908
おすすめ