大部分玩前端的小伙伴,在算法上都相对要薄弱些,毕竟调样式、调兼容就够掉头发的了,哪还有多余的头发再去折腾。
确实在前端中需要使用到算法的地方是比较少,但若要往高级方向发展,算法的基本功就非常重要啦。对了,算法在面试中可是必考项啊,所以为了期望薪资,头发还是得做下牺牲呀。
有些小伙伴认为,刷了那些奇奇怪怪的算法题,可在工作中很少能直接派上用场,嗯,没错,所以学算法是件高延迟满足的事情。那么学算法,到底收获什么呢?我觉得通过练习算法,培养我们解决问题的潜意识才是最重要的。
学习算法,最直接有效的就是刷题,刷题有很多渠道,我比较推荐 LeetCode,它有国内和国外版,非常方便。现在网上有很多大牛都分享各自刷题的解法,但百读不如一练嘛,所以我也开个【来刷LeetCode】系列,由浅入深,分享我的解法和思路,因为我的解法肯定不是最棒的,所以还会在加上我觉得优秀的解法。
哔哔了这么多,我们现在开撸。代码略多,建议大家先点个赞(我就是来骗赞的~)
两数之和
两数之和,题目描述如下:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的思路
这题,最暴力的解法就是逐个循环查找,但时间复杂度是 n*n ,太暴力的不适合我们。
可以这么看,在遍历第一个值得时候,保留这个值与target的差,然后在下次遍历中,看看是不是与保留的差值相同,如果相同,那么就可以找到我们想要的结果了。画个简单的表格如下:
序号 | 当前值 | 差值 |
---|---|---|
0 | 2 | 7 |
1 | 7 | 2 |
这样一来,就需要记录差值,散列表这一数据结构就排上用场了,来看看百科关于散列表的介绍:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
而js中的对象就是基于哈希表结构,所以我们构造一个js对象即可,value是当前遍历到的值,key是其与目标值的差。
这是我的解法如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let map = {
};
let result = []
for (let index = 0;index <= nums.length;index++) {
const val = nums[index];
if (map[val] !== undefined) {
result.push(map[val], index);
break;
}
const a = target - val