由于最近被字节面试虐了,痛定思痛开这个系列狂补下编程能力。那就先从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
}
};

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