整数の配列 nums と整数のターゲット値 target が与えられた場合、配列内で合計がターゲット値 target となる 2 つの整数を見つけて、それらの配列の添字を返してください。
各入力に対して答えは 1 つだけであると想定できます。ただし、配列内の同じ要素を回答内に繰り返し出現させることはできません。
回答は任意の順序で返すことができます。
例 1:
入力: nums = [2,7,11,15]、ターゲット = 9
出力: [0,1]
説明: nums[0] + nums[1] == 9 であるため、[0, 1] を返します。
方法 1: ループ版の弱いチキン
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let arr = []
for(let i=0; i<nums.length; i++) {
for(let j=i+1; j<nums.length; j++) {
if(nums[i]+nums[j] == target) {
arr.push(i)
arr.push(j)
return arr
}
}
}
};
方法 2: 元の配列をマップに変換します (キー: 配列要素、値: 対応する添え字)
ループするときに、i 番目の要素 num[i] のマップに key=target-num[i] があるかどうかを確認します。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map();
for (let i=0; i<nums.length; i++){
map.set(nums[i],i)
}
let arr = []
for(let i=0; i<nums.length; i++){
if(map.has(target-nums[i]) && i!=map.get(target-nums[i]) ){
arr.push(i)
arr.push(map.get(target-nums[i]))
return arr
}
}
};
方法 3: 上級バージョン、カプセル化マップと検索マップを実現するループ。前の要素が検索内で対応する項目を見つけられなかった場合でも、検索が実行されるたびに前の要素がマップにカプセル化されるという考えです。地図ですが、後で横断するときに見つけます。ただし、比較後にマップをコピーする必要があり、重複したキー値の後者の項目が前の項目を上書きするため、出力時に前の項目の添字が見つからないことに注意してください。
テストケース [3,3] 6 など
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map();
for (let i=0; i<nums.length; i++){
if(map.has(target-nums[i]) && i!= map.get(target-nums[i])){
return [i,map.get(target-nums[i])]
}
map.set(nums[i],i)
}
};