前言
Leetcode 算法题是一个全新的文章系列,该系列将会抽选 Leetcode 上题目记录解题思路以及总结等
tips: 为节省文章篇幅,题目描述以及相关示例本系列文章中不再额外赘述,可以对照题目原链接查看
本篇为 Leetcode 第 1 题-两数之和,题目链接:两数之和
题解
无限猴子定理最早是由埃米尔·博雷尔在 1909 年出版的一本谈概率的书籍中提到的,此书中介绍了“打字的猴子”的概念。无限猴子定理是概率论中的柯尔莫哥洛夫的零一律的其中一个命题的例子。大概意思是,如果让一只猴子在打字机上随机地进行按键,如果一直不停的这样按下去,只要时间达到无穷时,这只猴子就几乎必然可以打出任何给定的文字,甚至是莎士比亚的全套著作也可以打出来。
既然题目指出一定存在一组满足条件的数,那我们通过随机总能找到最终的答案;简而言之 10 次不行,那就来 100 次,100 次还不行?那就试试 10000 次
1 2 3 4 5 6 7 8 9 10 11
| const twoSum = function (nums, target) { const l = nums.length while (true) { const idx1 = parseInt(Math.random() * l) const idx2 = parseInt(Math.random() * l) if (idx1 !== idx2 && nums[idx1] + nums[idx2] === target) return [idx1, idx2] } }
|
分析:因为我们求解过程的核心在于随机上,因此我们得到答案所需要循环的次数是不确定的,或许运气好一次循环就能找到满足条件的两个数,也有可能需要一直循环下去,因此这种方式求解的时间复杂度不可衡量,是娱乐的解法 😄
1 2 3 4 5 6 7 8 9 10 11 12 13
| const twoSum = function (nums, target) { let num1, num2 for (let i = 0; i < nums.length; i++) { num1 = nums[i] for (let j = i + 1; j < nums.length; j++) { num2 = nums[j] if (num1 + num2 === target) return [i, j] } } }
|
分析:因为采取了两层嵌套的for
循环,所以时间复杂度上是 O(N^2)
1 2 3 4 5 6 7 8 9 10 11 12
| const twoSum2 = function (nums, target) { const map = new Map() for (let i = 0; i < nums.length; i++) { const num = target - nums[i] if (map.has(num)) return [map.get(num), i] map.set(nums[i], i) } }
|
分析:一次for
循环就能找出符合题意的答案,时间复杂度为 O(N),空间复杂度 O(N),为创建哈希表的开销