タイトルの説明:整数配列の場合、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のプログラミングは傷つけるわけにはいかない...