データ構造学習ノート 1: 配列

1. アレイ

  • 非常にシンプルで一般的に使用され、通常は他の知識ポイントと組み合わせて調査します

タイトル: 217. 重複した要素が存在します

コードテンプレート:

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        # 遍历
        dct = set()
        for n in nums:
            if n not in dct:
                dct.add(n)
            else:
                return True
        return False

トピック: 1. 2 つの数値の合計

コードテンプレート:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dct = {
    
    }
        for i, v in enumerate(nums):
            if v in dct:
                return [dct[v], i]
            else:
                dct[target-v] = i

最初の質問は非常に古典的です。

トピック: 88. ソートされた 2 つの配列をマージする

コードテンプレート:

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # 从后往前遍历,双指针
        k = len(nums1)-1
        m -= 1
        n -= 1
        while k > -1:
            if n > -1 and m > -1:
                if nums1[m] < nums2[n]:
                    nums1[k] = nums2[n]
                    n -= 1
                else:
                    nums1[k] = nums1[m]
                    m -= 1
            elif n > -1:
                nums1[k] = nums2[n]
                n -= 1
            # 如果 n== -1,可以直接return
            else:
                return
            k -= 1

古典的な発想の転換、後ろから前へ

タイトル: 350. 2 つの配列の交差 II

コードテンプレート:

# 法1
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 不借助Counter
        nums1.sort()
        nums2.sort()
        res = []
        n1, n2 = len(nums1), len(nums2)
        i = j = 0
        while i < n1 and j < n2:
            if nums1[i] < nums2[j]:
                i += 1
            elif nums1[i] > nums2[j]:
                j += 1
            else:
                res.append(nums1[i])
                i += 1
                j += 1
        return res
# 法2
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 借助Counter,在二者长度差异大的时候效率高
        if len(nums1) > len(nums2):
            return self.intersect(nums2, nums1)
        
        res = []
        ctr = Counter(nums1)
        for n in nums2:
            if n in ctr:
                ctr[n] -= 1
                res.append(n)
                if ctr[n] == 0:
                    ctr.pop(n)
        return res

この質問は、特に nums1 と nums2 の長さの差が大きい場合、ハッシュ テーブル クエリを使用する方がさらに効率的です。

タイトル: 36. 有効な数独

コードテンプレート:

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        row = [[0] * 9 for _ in range(9)]
        col = [[0] * 9 for _ in range(9)]
        mat = [[[0] * 9 for _ in range(3)] for _ in range(3)]
        # mat最先定义的在最后索引
        for i in range(9):
            for j in range(9):
                c = board[i][j]
                if c != '.':
                    idx = int(c) - 1
                    row[i][idx] += 1
                    col[idx][j] += 1
                    mat[i//3][j//3][idx] += 1
                    if row[i][idx]>1 or col[idx][j]>1 or mat[i//3][j//3][idx]>1:
                        return False
        return True

型が固定されている場合は、配列を使用してハッシュ テーブルと同様の重複チェック機能を実装することもできます。

おすすめ

転載: blog.csdn.net/qq_45510888/article/details/123714545