序:私
は最近go言語を学んでいるので、将来的にはjavaとgoの2種類のアルゴリズム問題の解決策を提供します。私はjavaをあきらめるつもりはありません。言語はすべて相互にリンクしています。重要なのはアイデアです。
タイトルの説明
整数配列numsとターゲット値targetを指定して、合計が配列内のターゲット値である2つの整数を見つけ、それらの配列インデックスを返します。
各入力は1つの回答にのみ対応すると想定できます。ただし、この配列で同じ要素を再利用することはできません。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
問題解決のアイデア
この問題が時間の複雑さを考慮しない場合、ブルートフォース法を使用してそれを解くことができます各要素xをトラバースし、target-xに等しい値を持つターゲット要素があるかどうかを調べます。そのような時間の複雑さはO(n2)であり、空間の複雑さはO(1)です。この問題を解決するより良い方法はありますか?ハッシュテーブルを使用してこの問題を解決できます。要素を繰り返し処理してハッシュテーブルに挿入するときに、戻って、現在の要素に対応するターゲット要素がハッシュテーブルに既に存在するかどうかを確認します。存在する場合は、対応するソリューションを見つけて、すぐに返します。このようにして、時間の複雑度はO(n)になり、空間の複雑度はO(n)になります。これは、時間と空間を交換することで効率を改善することです。理解できない場合は、コードを見てください。直接理解できます。
コードサンプル
golang
func twoSum(nums []int, target int) []int{
m := make(map[int]int,10)
for i,v :=range nums{
k,ok:=m[target-v]
if ok{
return []int{k,i}
}
m[v] = i
}
return nil
}
java
class Solution {
public int[] twoSum(int[] nums, int target) {
Map <Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++)
{
int tmp=target-nums[i];
if(map.containsKey(tmp))
{
return new int[] {map.get(tmp),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}
}