開坑,之後每週刷一兩道LeetCode
兩數之和:數組
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。優化示例
給定 nums = [2, 7, 11, 15], target = 9
由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]spa
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function(nums, target) { const comp = {}; for(let i=0; i<nums.length; i++){ if(comp[target - nums[i] ]>=0){ return [ comp[target - nums[i] ] , i] } comp[nums[i]] = i } };
遍歷數組,定義一個對象,
對象屬性的key是順序遍歷中數組項的value,對象屬性的value是數組項的下標code
comp[target-nums[i]] = i
一旦存在對象中target-nums[i]屬性的值(即數組項的下標)大於0,即存在數組中兩數之和等於target對象
if(comp[target - nums[i] ]>=0){ return [ comp[target - nums[i] ] , i] }
我還能說什麼,map掌握得爐火純青。排序
公開處刑現場leetcode
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function (nums, target) { function isEqualToTarget(num1, num2) { if (num1 + num2 === target) { return true } else { return false } } function findTargetItem(arr, oldArr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = i + 1; j < arr.length; j++) { if (isEqualToTarget(arr[i], arr[j])) { return [oldArr.indexOf(arr[i]), oldArr.length - 1 - oldArr.reverse().indexOf(arr[j])] } } } } const oldArray = nums.slice(0) nums.sort((a, b) => a - b) let tailIndex = nums.findIndex((value, index) => { return value >= target - nums[0] && index !== 0 }) if (tailIndex === -1) { // [5, 7, 11, 12] 18 return findTargetItem(nums, oldArray) } else if (isEqualToTarget(nums[0], nums[tailIndex])) { return [oldArray.indexOf(nums[0]), oldArray.length - 1 - oldArray.reverse().indexOf(nums[tailIndex])] } else { nums.length = tailIndex + 1 return findTargetItem(nums, oldArray) } };
當時寫的主要想法依然是暴力遍歷,只不過作了一丁點兒優化get
nums.sort((a, b) => a - b) let tailIndex = nums.findIndex((value, index) => { return value >= target - nums[0] && index !== 0 })
先從小到大排序,而後去掉與數組最小值相加大於target的值。
這個過程算優化吧/捂臉
好歹打敗70%多的提交記錄,還有繼續的勇氣it