该死的行业太卷了,谁能想到前端也要学算法,学习前端就是觉得算法太难,没想到...呜呜呜,一言难尽。边工作边学习,每天学一点,暂时还没找到学习算法的方法,就在这里每天记录一点吧。
问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解法一:暴力枚举(JavaScript 实现)
最直接的方法是通过两层循环遍历数组中的每一对元素,并检查它们的和是否等于目标值。
function twoSumBruteForce(nums, target) {
const n = nums.length;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
// 如果没有找到符合条件的数对,返回一个空数组
return [];
}
解法二:哈希表优化(JavaScript 实现)
为了优化时间复杂度,我们可以使用哈希表(在JavaScript中通常使用对象或Map)来存储已经遍历过的元素及其索引。这样,我们可以在O(1)的时间复杂度内查找某个数是否存在于哈希表中。
function twoSumHashTable(nums, target) {
const numMap = {};
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (complement in numMap) {
return [numMap[complement], i];
}
numMap[nums[i]] = i;
}
return [];
}
总结
以为挺简单,实则一点也不简单,第一眼想到的是两个遍历解决问题,刚运行就翻车了,没有做判断,会有两个遍历都从第一个元素开始,业务能力还是不够呀。其次map对于我一个刚入行前端的小白来说基本没用过,这里的话发现其实用对象也是可以的,得加强下map的学习。。。
摸鱼时候再来战!