mirror of
https://github.com/labuladong/fucking-algorithm.git
synced 2025-07-04 19:28:07 +08:00
update content
This commit is contained in:
@ -63,7 +63,7 @@
|
||||
|
||||
很遗憾,并不是,比如说把楼层变高一些,100 层,给你 2 个鸡蛋,你在 50 层扔一下,碎了,那就只能线性扫描 1~49 层了,最坏情况下要扔 50 次。
|
||||
|
||||
如果不要「二分」,变成「五分」「十分」都会大幅减少最坏情况下的尝试次数。比方说第一个鸡蛋每隔十层楼扔,在哪里碎了第二个鸡蛋一个个线性扫描,总共不会超过 20 次。最优解其实是 14 次。最优策略非常多,而且并没有什么规律可言。
|
||||
如果不要「二分」,变成「五分」「十分」都会大幅减少最坏情况下的尝试次数。比方说第一个鸡蛋每隔十层楼扔,在哪里碎了第二个鸡蛋一个个线性扫描,总共不会超过 20 次。最优解其实是 14 次。最优策略非常多,而且并没有什么规律可言。
|
||||
|
||||
说了这么多废话,就是确保大家理解了题目的意思,而且认识到这个题目确实复杂,就连我们手算都不容易,如何用算法解决呢?
|
||||
|
||||
|
@ -253,7 +253,7 @@ class MyStack {
|
||||
}
|
||||
```
|
||||
|
||||
很明显,用队列实现栈的话,`pop` 操作时间复杂度是 O(N),其他操作都是 O(1)。
|
||||
很明显,用队列实现栈的话,`pop` 操作时间复杂度是 O(N),其他操作都是 O(1)。
|
||||
|
||||
个人认为,用队列实现栈是没啥亮点的问题,但是**用双栈实现队列是值得学习的**。
|
||||
|
||||
|
@ -193,7 +193,7 @@ class Solution {
|
||||
|
||||
至此,这道题目就解决了,其实框架完全没有变,套路都是一样的,我们只是花了比较多的时间将滑动拼图游戏转化成 BFS 算法。
|
||||
|
||||
很多益智游戏都是这样,虽然看起来特别巧妙,但都架不住暴力穷举,常用的算法就是回溯算法或者 BFS 算法。
|
||||
很多益智游戏都是这样,虽然看起来特别巧妙,但都架不住暴力穷举,常用的算法就是回溯算法或者 BFS 算法。
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
http://graphics.stanford.edu/~seander/bithacks.html
|
||||
|
||||
但是这些技巧大部分都过于晦涩,我觉得可以作为字典查阅,没必要逐条深究。但我认为那些有趣的、有用的位运算技巧,是我们每个人需要掌握的。
|
||||
但是这些技巧大部分都过于晦涩,我觉得可以作为字典查阅,没必要逐条深究。但我认为那些有趣的、有用的位运算技巧,是我们每个人需要掌握的。
|
||||
|
||||
所以本文由浅入深,先展示几个有趣(但没卵用)的位运算技巧,然后再汇总一些在算法题以及工程开发中常用的位运算技巧。
|
||||
|
||||
|
@ -133,7 +133,7 @@ class Solution {
|
||||
|
||||
算法的时间复杂度很容易计算,因为递归调用的次数是 `n`,每次递归调用都需要一次 for 循环,时间复杂度是 O(n),所以总的复杂度是 O(n^2)。
|
||||
|
||||
**最后,我们可以思考一个问题**:按照我们这个思路,得出的操作序列长度应该为 `2(n - 1)`,因为每次递归都要进行 2 次翻转并记录操作,总共有 `n` 层递归,但由于 base case 直接返回结果,不进行翻转,所以最终的操作序列长度应该是固定的 `2(n - 1)`。
|
||||
**最后,我们可以思考一个问题**:按照我们这个思路,得出的操作序列长度应该为 `2(n - 1)`,因为每次递归都要进行 2 次翻转并记录操作,总共有 `n` 层递归,但由于 base case 直接返回结果,不进行翻转,所以最终的操作序列长度应该是固定的 `2(n - 1)`。
|
||||
|
||||
显然,这个结果不是最优的(最短的),比如说一堆煎饼 `[3,2,4,1]`,我们的算法得到的翻转序列是 `[3,4,2,3,1,2]`,但是最快捷的翻转方法应该是 `[2,3,4]`:
|
||||
|
||||
|
Reference in New Issue
Block a user