leetcode 两数之和

75 阅读1分钟

这绝对是 leetcode 的经典题目

image.png

有简单解法,也有进阶解法,适合大多数人。

简单解法 O(n^2)

这个方法有一定编程基础的人都能想到,就是双层循环,第一层i遍历全部元素,第二层j遍历i+1和后面的全部元素,之后如果出现i和j的元素之和等于target,那么就返回答案。

这个不错,理解起来简单,但就是时间复杂度太高了(作为通用场景下的前端开发,这样逻辑写就足够了,因为n不会过大)

进阶解法

O(n^2) 是不太理想的时间复杂度,那么有办法优化吗?

二分

我自己想到的是二分查找:这里有个简单的推理你要知道,因为num[i]+num[j]=target,那么num[j]=target-num[i],所以你可以先把数组排序,之后遍历i,又因为数组是有序的,所以找j的话可以二分。

排序复杂度O(nlogn),遍历加二分查找复杂度O(nlogn),所以总体复杂度是O(nlogn)

HashMap

也许是写前端的时间久了,忘了 Java 的 HashMap这种数据结构,他是一个key value 键值对,并且能以O(1)的时间从key get 到value,那通过此数据结构就能优化到O(n)的时间复杂度。(JavaScript中的Object 和 Map 也有类似功效)

虽然题目标签写的「简单」,但想写出优秀的代码还是有难度,对于题目,我们应该追求更好的解法。