リートコードブラッシングレコード1-2つの数値の合計

タイトルの説明:整数配列の場合、2つの数値の合計が指定された数値と等しい場合、これら2つの数値の添え字が返されます。例えば

所与NUMS = [2、7、11、15]、目標= 9

ためNUMS [ 0 ] + NUMS [ 1 ] = 2 + 7 = 9
リターン[ので0,1 ]

注:配列内の各要素は2回以上使用することはできません。

アイデア:ハッシュテーブルを使用して、要素と要素インデックスの間の関係をマッピングします。検索テーブルの複雑さをO(n)から約O(1)に減らします。概算とは、ハッシュテーブルの同じ要素が競合する場合、最悪の場合もO(n)になる可能性があることを意味します。

方法1:2パスハッシュテーブル

2つのループを確立します。最初のループは配列内の値と対応するインデックスをハッシュテーブルO(n)に追加し、要素が指定された数の補数に対して相対的である場合、2番目のループは配列内の各要素をトラバースしますハッシュテーブルでは、添え字が返されます。一度トラバースすることの複雑さもO(n)です。

全体的な時間の複雑さはO(2n + 1)= O(n)であり、空間の複雑さはO(n)です。

コード:

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dict1 = {}
        list1 = []
        for i in range(0,len(nums)):
            dict1[nums[i]] = i
        
        for j in range(0,len(nums)):
            if target-nums[j] in dict1 and nums[j]!=target-nums[j]:
                list1.append(dict1[nums[j]])
                list1.append(dict1[target-nums[j]])
                del dict1[nums[j]]
                del dict1[target-nums[j]]
        return (list1)

このように記述されたコードはテストに合格しませんでした。その理由は、テスト例に[3,3]のような配列があり、辞書の名前が同じになるためです。これを解決する方法がわかりません。

方法2:ワンパスハッシュテーブルを使用する

方法2は方法1と同様です。つまり、ハッシュテーブルを作成するときに、インデックス値に対応する数値の補数が辞書キーとして使用され、インデックス値自体がキー値として使用されます。配列の初期位置は要素をトラバースします。要素が辞書にない場合は、その補数がキーとして使用され、インデックス値自体がキー値として辞書に追加されるため、この番号の補数にインデックスを付けると、対応するキーが値は配列内の番号の位置、つまり返される配列の最初の要素であり、補数の番号に対応するインデックスは返される配列の2番目の要素です。

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        if len(nums)<1:
            return False
        dict1 = {}
        for i in range(0,len(nums)):
            if nums[i] in dict1:
                return [dict1[nums[i]],i]
            else:
                dict1[target-nums[i]]=i
                

これまでのところ、質問は完了です

ねえ、Xiaobaiのプログラミングは傷つけるわけにはいかない...

おすすめ

転載: blog.csdn.net/qq_22472047/article/details/80368837
おすすめ