2 つの数値の合計
整数配列 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]、target = 6
出力: [1,2]
例 3:
入力: nums = [3,3]、target = 6
出力: [0,1]
解決策 1:
- アイデア:
ネストされた while ループを使用して、各数値をその後ろの数値に加算し、加算後にターゲット値が得られたら、2 つの数値の添字を直接返します。 - 時間計算量:
ロジック コードの実装に関して、この質問ではネストされた while ループが使用されます。while ループの時間計算量は O(log n) で、ネストされたループの時間計算量は O(log n* log n) です。まだ O(log n) です - 具体的なコードは次のように実装されます。
class Solution {
public int[] twoSum(int[] nums, int target) {
int index = 0;
int[] arr = new int[2];
while(index < nums.length-1){
int i = index+1;
while (i < nums.length) {
int temp = nums[index] + nums[i];
if (temp == target) {
arr[0] = index;
arr[1] = i;
return arr;
}
i++;
}
index++;
}
return null;
}
}
解決策 2:
- アイデア:
マップのキーと値の機能を使用して、配列の値と添え字をそれぞれキーと値に保存します。各値をマップの近くに保存する前に、まずターゲット現在の値を使用します。マップにキーがある場合は、結果の後に、キーに対応する値と現在の値の添え字が直接返されます。 - 時間計算量:
この実装ロジックでは for ループが使用されており、ハッシュ ルックアップの時間計算量は O(1) であるため、このコード実装の時間計算量は O(n) です。 - 具体的なコードは次のように実装されます。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i< nums.length; i++) {
if(map.containsKey(target - nums[i])) {
return new int[] {map.get(target-nums[i]),i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}