挑战「LeetCode」每日一题第2天

113 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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; };