問題の説明
整数の配列 nums と整数のターゲット値 target が与えられた場合、配列内で合計がターゲット値 target となる 2 つの整数を見つけて、それらの配列の添字を返してください。
各入力に対して答えが 1 つだけあると想定できます。ただし、配列内の同じ要素を回答内に繰り返し出現させることはできません。
回答は任意の順序で返すことができます。
テストケース
例 1:
入力: nums = [2,7,11,15]、ターゲット = 9
出力: [0,1]
説明: nums[0] + nums[1] == 9 であるため、[0, 1] を返します。
例 2:
入力: nums = [3,2,4]、ターゲット = 6
出力: [1,2]
例 3:
入力: 数値 = [3,3]、ターゲット = 6
出力: [0,1]
ヒント:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
有効な答えは 1 つだけです
解決策 1: (暴力的な列挙)
時間計算量: O(n²) 空間計算量: O(1)
コードは次のとおりです (例)。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return i,j
解決策 2
アイデア: num2 = target - num1 も nums にあるかどうかを判断します。nums.index でインデックスを直接見つける場合
時間計算量: O(n) 空間計算量: O(n)
コードは次のとおりです (例)。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
l=len(nums)
for i in range(l-1):
num1=nums[i+1:l]
if (target-nums[i]) in num1:
j=nums.index(target-nums[i],i+1)
return [i,j]
解決策 3 (素晴らしい)
アイデア: ハッシュ テーブルを作成します。各 x について、まずターゲット - x がハッシュ テーブルに存在するかどうかをクエリします。存在しない場合は、x をハッシュ テーブルに挿入します。時間計算量: O(n) 空間計算量: O(n) コードは次のとおり
です
。以下のように(例):
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash=dict()
for index,value in enumerate(nums):
if target-nums[index] in hash:
return [index,hash[target-nums[index]]]
else:
hash[value]=index
return []
要約する
長い間コードを見ていなかったので、何かを忘れていました。。。