两数之和|刷题打卡

84 阅读1分钟

写在前面

最近开始制定了学习计划,其实算法不是什么很难的事情,只要掌握其核心思想,并且加以练习,总结归纳,就能掌握,贵在坚持,加油!

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。

解题思路

思路一

看到这个题,脑子里最快涌现的思路就是遍历,这是一种暴力解法,那我们来看看怎么实现吧

function twoSum(nums, target) { let result = [] let len = nums.length for (let i=0; i<len; i++) { for (let j=i+1; j<len; j++) { if (nums[i] + nums[j] == target) { result.push(i, j) } } } return result } 这种解题思路时间复杂度为O(n^2),性能上不太好,其实可以使用key的唯一性实现过滤,代替其中的一层遍历

思路二

js里可以使用Object和Map两种方式实现,下面使用Map方式

function twoSum(nums, target) { let map = new Map() let result = [] nums.forEach((item, index) => { let diff = target - item let key = map.has(diff) if (key) { result.push(key, index) } map.set(item, index) }) retrun result }

总结

这个算法题比较简单,刚开始使用暴力解法很顺畅,时间复杂度摆在那,所以性能不是很好,于是又思考了比较好的一种方案去实现。做题嘛,总是循序渐进的,发现问题所在,并且寻找到方案去提升,这就是进步!