LeetCode.1 兩數之和(Two Sum)(JS)

開坑,之後每週刷一兩道LeetCode

1、題目

兩數之和:數組

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。優化

示例

給定 nums = [2, 7, 11, 15], target = 9
由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]spa

2、優秀答案

/**
 * @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掌握得爐火純青。排序

3、個人答案

公開處刑現場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

4、路漫漫其修遠兮

相關文章
相關標籤/搜索