トピック:
整数配列NUMSと目標値の目標を考えると、配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
例:
考えるNUMS = [2、7、11 、15]、目標= 9
ためNUMS [0] + NUMS [1 ] = 2 + 7 = 9
返される[0,1]
1暴力的な問題解決のためのアイデア
時間の複雑さ:O(N ^ 2)
各要素について、我々はO(n)はO(n)の時間がかかります配列を介して、それの残りの部分に対応するターゲット要素を探してみてください。したがって、時間複雑度はO(N ^ 2)です。
複雑スペース:O(1)。
public int[] twoSum(int[]nums,int target){
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
return new int[0];
}
ハッシュマップによる2アイデア
時間の複雑さ:O(n)は、
我々は唯一のリストが含まれているn個の要素一度トラバースしなければなりません。各テーブルで行われたルックアップのみO(1)時間がかかります。
空間複雑:O(n)は、
追加のスペースが必要ですが、ハッシュテーブルに格納された要素の数に依存して、テーブルは、n個の要素まで保存する必要があります。
public int[] twoSum(int[]nums,int target){
Map<Integer,Integer> map = new HashMap();
for (int i = 0; i < nums.length; i++) {
int sub = target - nums[i];
if (map.containsKey(sub)) {
return new int[] {map.get(sub),i};
}
map.put(nums[i],i);
}
return new int[0];
}
leetCodeリンク二つの数