携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
😊 大家好,我是思淼MJ。
随着“后浪拍前浪”,于是我被拍到了沙滩上,一直在努力寻找自己的发展方向。都说:做事情规划固然重要,但行动更重要。于是就给自己订了个小目标,这就是这次挑战的由来,看看自己能坚持多久。欢迎小伙伴们,和我一起挑战打卡😊。
题目:两数之和
给定一个整数数组 nums 和一个整数目标值 target,
请你在该数组中找出 和为目标值 target 的那 两个 整数,
并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。
但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题思路:
方法一:暴力破解法
-
枚举数组中的每一项
x,去寻找可满足target - x的数字,最简单的方法就是双层遍历,找到两项相加值为target,并将其对应的index保存到数组arr中,并返回function twoSum (nums, target) { let arr = [] for (let i = 0; i < nums.length; i++) { for (let j = i+1; j < nums.length; j++) { if (nums[i] + nums[j] === target) { arr = [i, j] } } } return arr };
方法二:利用哈希表
-
为了提升时间以及空间复杂度,可以采用哈希表的方式来解题,即:创建一个哈希表,对于每一项 x ,判断哈希表中是否存在target - x ,如果不存在,就将此项作为哈希表的key,下标作为哈希表的value值,这样再遇到target - x,就直接在哈希表中查找判断x就可以了,可以保证x不会与自己匹配,也可以降级时间复杂度,只需要遍历数组一次就可以了
function twoSum (nums, target) { let hashTable = {} let arr = [] for (let i = 0; i < nums.length; i++) { if (hashTable[target - nums[i]] !== undefined) { arr = [hashTable[target - nums[i] + ''], i] } else { hashTable[target - nums[i] + ''] = i } } return arr; };