Leetcode每日一题-两数之和

294 阅读1分钟

由于最近被字节面试虐了,痛定思痛开这个系列狂补下编程能力。那就先从LeetCode简单高频题开始吧。

题目描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

示例:

给定 nums = [2, 7, 11, 15], target = 9

返回 [0, 1]

解答

方法一:暴力循环遍历

两个循环嵌套,遍历每个元素 x,查找是否存在一个值与 target - x 相等的目标元素。

var twoSum = function(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (target - nums[i] === nums[j]) {
        return [i, j]
      }
    }
  }
}

可以看出,方法一执行时间很长。

方法二:基于哈希表结构

哈希表是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

因为 object 是基于哈希表结构的,而哈希表的查找时间复杂度为O(1),array 时间复杂度是O(n),这样遍历 object 的速度比遍历 array 快很多。

以 array 中每一项的值作为一个 object 的 key,array 中每一项的 index 作为 object 的 value。

一旦存在对象中target-nums[i]属性的值(即数组项的下标)大于0,即存在数组中两数之和等于target。

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
    }
};

可以看出来,方法二的执行时间还是蛮快的。当然还有更优的解法,大家可以自己去看原题哦~~