two-sum兩數之和 javascript解答
阿新 • • 發佈:2020-08-20
LeetCode 第 1 號問題:兩數之和
題目地址
題目描述
給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一(Map 資料結構)
思路
首先把加法轉換成減法
然後利用 Map 的資料結構儲存 target 減去某一位置的值和位置 i 對應
接著判斷如果減出的值在 Map 結構中找到則跳出迴圈,否則將對於的減出來的值和陣列的索引 i 對應儲存
最後返回兩個索引
程式碼
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ const twoSum = function (nums, target) { const map = new Map(); const len = nums.length; //陣列長度 for (let i = 0; i < len; i++) { //遍歷查詢陣列nums let diff = target - nums[i]; //target減去對應的陣列的值 if (map.has(diff)) { //判斷是否已存在對應的減值,存在則取出返回,否則將減值(減出來的值)和對應索引儲存 return [map.get(diff), i]; } map.set(nums[i], i); //將減值(減出來的值)和對應索引儲存 } };
解法二(obj 屬性)
思路
將 obj 替換 Map 去解決問題
程式碼
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ const twoSum1 = function (nums, target) { const obj = {}; const len = nums.length; for (let i = 0; i < len; i++) { let I = nums[i]; let j = target - I]; if (obj[j] !== undefined) { return [obj[j], i]; } obj[I] = i; } };
解法三(暴力解法)
思路
遍歷解法
程式碼
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
const twoSum2 = function (nums, target) {
const len = nums.length;
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
};
解法四(map,forEach 的方法,存在問題不會直接返回)
思路
需要 try catch,扔出 error 才會直接返回,
程式碼
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
const twoSum3 = function (nums, target) {
const hash = {};
let result = [];
try {
nums.map(function (val, i) {
let reduce = target - val;
if (hash[reduce] !== undefined) {
result[0] = hash[reduce];
result[1] = i;
throw "err";
}
hash[val] = i;
});
} catch (err) {
return result;
}
};