タイトル説明
整数の配列を考えるnums
と、目標値をtarget
、あなたは配列にすることを目標値を見つける2つの整数、およびその配列の添字に戻ります。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
例:
给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
暴力的なソリューションへのソリューション
問題解決のためのアイデア
その暴力法は、2トラバース2つの数値とするかどうかを見つけることだと思う可能性が最も高いですtarget
。次のようにプロセスは以下のとおりです。
- 使用する
i
アレイの各要素を反復します i
各サイクルを用いてトラバースを開始しますj
i + 1
- 分析
i
およびj
対応する値とするかどうかtarget
コードの実装
func twoSum(nums []int, target int) []int {
for i := 0; i < len(nums); i ++ {
for j := i + 1; j < len(nums); j ++{
if nums[i] + nums[j] == target{
return []int{i,j}
}
}
}
return []int{}
}
複雑性分析
- 時間の複雑さ:O(N ^ 2)。2つのサイクルがあり、イベントの複雑さの各サイクルは、O(N)です。全体的な複雑さはO(N ^ 2)です。
- 複雑スペース:O(1)。
ソリューション2つのハッシュ・テーブル・ソリューション
問題解決のためのアイデア
解決策は、ハッシュテーブルに役立ちます。アレイを介して、現在の要素は、ハッシュテーブルに追加されたとき。そして、すでにハッシュテーブルに対応する目標電流要素があるかどうかをチェックします。リターンがあるかどうか。
コードの実装
func twoSum2(nums []int, target int) []int {
m := make(map[int]int)
for i := 0; i < len(nums); i ++ {
if index, exists := m[target - nums[i]]; exists {
return []int{i,index}
}
m[nums[i]] = i
}
return []int{}
}
複雑性分析
- 時間の複雑さ:O(n)を。私たちは、一度だけの配列を横断しました。
- 複雑スペース:O(n)を。ハッシュテーブル、追加スペースの必要性を使用してください。ハッシュテーブルに格納された要素の数に応じて、テーブルは、O(n)の要素まで格納する必要があります。