type
status
date
slug
summary
tags
category
icon
password
Algorithm
Complexity

Binary Search
The idea of binary search is very straight forward, but the details may drive people crazy.
Leetcode 69 Sqrt(x) // 这个题其实就相当于找比这个数小的,最大的一个
找到等于target,或者必 target 小的数中最大的一个
找小的
做二分查找的一些技巧:
- 把每种情况,== > < 都写的特别清楚,必须要把各种情况清晰
- 先排除一些 corner case
- 比如我们很清楚,0 1 的 sqrt 就是本身,那么直接开始的时候判断一下,返回
对于本题,如果细节不太清晰,我的一个小技巧是,用个 third variable, 来记录可能的答案,记录完之后直接往下走,左右都没有停留。不是特别好看但能够解决问题。
正式的写法:
- 首先我们不能陷入无尽的循环,这是很重要的一件事,既然不能无限循环,那么必然小的一边也要走,不能有 left = mid,这就是纯纯无限循环。
- 既然这样一直往下走了,那么我们可以知道 left 一定不会是最后的答案,因为它总是往下走,可能把正确答案都走过了,所以最后应该返回 high 是答案。
另一种经典情况,找比这个数大的,最小的一个:
找大的一个,那么碰到大的情况,就可以 high = mid,因为 mid 总是向 left 走,最后 left 一定错出,然后 high 是可能的答案
无脑用第三变量!记录可能答案,两头都往下走。
Template
If we do:
Leetcode 540
分奇偶
学到一个技巧,^ 1,会把偶数变成加一的数,把奇数变成减一的数,图论中有更多的应用
或者分奇偶的方式处理:
DFS and BFS (Search)
Back Track
Back Track Template
labuladong back track
Template
labuladong 把所有回溯都看成树的问题🌲
既然看成树🌲,有时候就需要剪枝,对付一些有重复的情况
例题:
排列-组合-子集 问题 → back track
涉及到给的数组里有重复的,可能需要剪枝
一些排列的题目,所有元素都要用上,可能需要多加一个 boolean[] used,来记录那些出现过
例题:全排序
39
用回溯做的,回溯最熟,剪枝(这题必须剪枝,不然有重复),然后找到答案记录下来即可
还有一种代码更简单的写法,但这种写法每次都生成新数组,时间和空间复杂度更高(仅仅看起来简单而已),其实实际写的时候,还是上面的写的顺利,符合那个做选择,撤销选择的逻辑
Two pointers
Tree
很多东西都可以看成树:链表,回溯,快排,merge sorted list
前中后序的理解:
在树的题目大体有两种思路:
- 遍历,配合外部变量
- 分解问题,只专注这一个点如何操作
分解问题的思想,例题:


层次遍历 Order traverse

Dynamic Programming 动态规划
Cyc dp
- Cyc 自底向上的写法比较多
- 01 背包的问题重点看
- 自己写了一些自顶向下的方法(直接无脑递归)
- 01 背包学 Cyc
任何题目,都推荐先上来 brute force,暴力递归解决,然后再优化
01 bag
从一堆东西里拿一部分东西,让这些有一个特定的和,或者让这些拿出来的东西特定的变成什么样,这就叫 01 背包!
- 东西只能拿一次
- dp table
- dp[i] 就表示 target 是 i 的时候答案是多少
- 长度是 target + 1,dp[target] 是答案
- 两个 for
- 外层的循环 num
- 外层循环 num 就是说,每循环一个 num,都更新一轮 dp
- 内层的循环 target
- 从大到小循环,这样才说明这个物品只用了一次,不重复用
- 时间复杂度就是 O(nm)
如果是回溯的方法(看成树,树的每个节点都可能是答案),遍历所有的可能的拿的组合,那么时间复杂就是 O(2^n) exponential 时间复杂度是指数型的,而 dp 的是平方的,一般情况下,当然是平方的 dp 好,但也有例外,如果 m 特别特别大,那么可能指数型的反而更好
- Author:Henan Mu
- URL:http://preview.tangly1024.com/article/example-5
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!