Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
提供指定數組與一個整數目標,回傳兩個數字相加等於目標的陣列位置。
Example 1:
Input: nums = [2,7,11,15], target = 9 Output: [0,1] Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Example 2:
Input: nums = [3,2,4], target = 6 Output: [1,2]
Example 3:
Input: nums = [3,3], target = 6 Output: [0,1]
Solution:
1. 想像數組的陣列為一區塊
2. 用「for迴圈」將目標值與陣列依序判斷
3.「if條件」將目標值減去數組中的數字並判斷是否未定義
true:不是未定義,回傳[對應 hashTable 中值的位置 , 回合數]
false:是未定義,將比對回合數放入 hashTable 中對應數組位置
ex.詳情請閱FlowChart
Code 1:
var twoSum = function (nums: number[], target: number): number[] {
const hashTable: Record<string, number> = {};
for (let i = 0; i < nums.length; i++) {
if (hashTable[target - nums[i]] !== undefined) {
return [hashTable[target - nums[i]], i];
} else {
hashTable[nums[i]] = i;
}
}
return [];
};
FlowChart:
Example 1
Input: nums = [2, 7, 11, 15], target = 9
i = 0 1 2 3
2 7 11 15
step.1
hashTable = {} // 初始為空物件
i = 0; nums[i] = 2;
if ((hashTable[9 - 2]) === undefined) // hashTable[7] 不存在
hashTable[nums[i]] = i; // 將 2 的索引存入 hashTable,結果:hashTable = { '2': 0 }
step.2
hashTable = { 2: 0 }
i = 1; nums[1] = 7;
if ((hashTable[9 - 7]) !== undefined) // hashTable[2] 存在,且值為 0
return ([hashTable[9 - 7], 1]); // 返回 [0, 1]
Remark: 暴力解 => for{nums[i]} > for{nums[j]} > if{i + j = target},return [i, j]。(雙迴圈的時間複雜度是O(n^2))
var twoSum = function(nums, target) {
const box = {};
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
};
Code 2: map + forEach
var twoSum = function (nums: number[], target: number): number[] {
const indexMap: Map<number, number> = new Map();
let result: number[] = [];
nums.forEach((num, index) => {
const complement = target - num;
if (indexMap.has(complement)) {
result = [indexMap.get(complement)!, index];
}
indexMap.set(num, index);
});
return result;
};