要求
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代碼
var twoSum = function(nums,target){
var temp;
var temp_index;
for(var i = 0;i < nums.length;i++){
temp = target - nums[i];
temp_index = nums.lastIndexOf(temp);
if(temp_index !== -1 && temp_index !== i){
return [i,temp_index];
}
leetcode耗時188ms,發現其運行很慢,即使用Array.prototype.lastIndexOf()來尋找元素索引效率比較低下.
優化
改用哈希表來搜索元素,因爲其查找元素的時間複雜度爲0(1).因JavaScript沒有內置哈希表,因此用對象來代替,因爲不用進行hash化,因此效率應該比哈希表的高.
var twoSum = function(nums,target) {
let hash = new Object()
for(let i = 0;i < nums.length;i++) {
let temp = target - nums[i]
if(hash.hasOwnProperty(temp)) {
return [hash[temp], i]
}
// 遍歷的同時構建哈希表,不用事先遍歷數組構建哈希表
// 因爲要用hash來搜索數組元素,因此數組元素作爲鍵值,索引其對應值
hash[nums[i]] = i
}
}
leetcode耗時64ms,測試結果爲上一方法的三倍速度