LeetCode 題目地址:https://leetcode-cn.com/problems/two-sum/description/
題目
給定一個整數(shù)數(shù)組和一個目標值漱办,找出數(shù)組中和為目標值的兩個數(shù)佳镜。
你可以假設(shè)每個輸入只對應(yīng)一種答案继控,且同樣的元素不能被重復利用芝加。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
JavaScript:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
};
解答
方法一
獲取一個元素之后备畦,向后查找是否有與其相對應(yīng)的數(shù)字,如果沒有嘹吨,找下一個元素搬味。如果有,則返回蟀拷。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let 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];
break;
}
}
}
return [];
}
方法二
獲取一個元素a碰纬,我們又知道了兩數(shù)之和target,所以我們可以通過target - a 的計算问芬,得到我們要找的另外一個數(shù)字悦析,這個時候我們在數(shù)組中查找就好。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let n;
let x;
let len = nums.length - 1;
for(let i = 0; i < len; i++) {
n = target - nums[i]; // 獲取滿足條件的另一個數(shù)字
x = nums.indexOf(n, i + 1); // 在nums數(shù)組中的第 i+1個元素之后此衅,查找是否存在n
if(x > -1) {
return [i, x];
}
}
return [];
};
方法三
方法二 中的indexOf其實也算是遍歷了一遍數(shù)組强戴,遍歷數(shù)組是很浪費時間的,那么我們有沒有什么辦法可以快速的查找數(shù)據(jù)呢挡鞍?
為了更快速的查找改元素骑歹,我們定義一個對象obj,將key定義為數(shù)組元素墨微,value定義為該數(shù)組元素在數(shù)組中定義的下標道媚,例如:
let nums = [2, 7, 11, 15];
將 nums 改寫成 obj
let obj = {
"2" : 0,
"7" : 1,
"11" : 2,
"15" : 3
}
假設(shè)我們要數(shù)字11在nums數(shù)組中所在的位置,只需obj["11"]即可獲取翘县。
解題代碼如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let len = nums.length;
let n = {};
for(let i = 0; i < len; i++) {
if (n[ target - nums[i] ] !== undefined){
return [n[ target-nums[i] ], i];
}
n[ nums[i] ] = i;
}
return [];
};
轉(zhuǎn)載請注明:轉(zhuǎn)自尹小芃槑