贪心算法:
局部最优——>整体最优
写模版
验证:对数器
会议室宣讲:会议结束时间早先安排,开始排序好之后删掉时间段重复的
单词字典拼接:使得拼接后在字典中尽可能在前面
贪心策略:1.谁在字典前面拼接时放前面❌(b与ba)
哈夫曼编码:
用小根堆拍好之后,拿出最小的两个结合成一个,再扔回堆里去,再拿出最小的两个结合,重复
融资问题:有初始资金,最多做的项目的限制
小根堆:花费(锁住的项目),,大根堆:利润(解锁的项目)
堆的应用:
一个数据流中,随时可以取得中位数:
大小根堆配合
1)当前给的数是否小于等于大根堆堆顶,
2)是的话,当前数字入大根堆,不是入小根堆,
3)大根堆与小根堆比size大小,大size-小size到2的话 大的堆顶去小的堆里
最终,小的N/2在大根堆,大的N/2在小根堆
N皇后问题:
是指在N*N的棋盘.上要摆N个皇后,要求任何两个皇后不同行、不同列,也不在同一条斜线上。给定一个整数n,返回n皇后的摆法有多少种。
n=1,返回1。
n=2或3,2皇后和3皇后问题无论怎么摆都不行,返回0。
n=8,返回92。
可利用位运算的限制代替record
暴力递归就是尝试
1,把问题转化为规模缩小了的同类问题的子问题
2,有明确的不需要继续进行递归的条件(base case)
3,有当得到了子问题的结果之后的决策过程
4,不记录每一个子问题的解
汉诺塔问题
三根杆,放大小碟子
杆:form to other
P函数(I,form,to, other)
{
1.将i-1个圆盘从form—>other
(调用函数P(i-1, from, other, to))
2.第I个圆盘从form—>to
(直接打印)
3.将i-1个从other—>to
(调用函数P(i-1, other, to, from))
}
打印一个字符串的全部子序列,包括空字符串:求子集
每个字符两条路,要或不要,构成一棵满树
打印一个字符串的全部排列:(leetcode46)
str[i…]范围上,所有的字符都可以在i位置上,后续都去尝试
str[0, …, i] 范围上,是之前做好的选择——>str
纸牌左右:
给定一个整型数组arr,代表数值不同的纸牌排成一条线。 玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。
leetcode(486)
自己先::
int f(arr, L, R)
if L==R
得分:arr(L)+S(am, L+1, R). S:后手函数
或者 arr(R)+S(am, L, R-1)
别人先:后手函数S为
f(arr, L+1, R)和f(arr, L, R-1)中的小的
给一个栈,将它逆序,不能申请额外数据结构,只能递归
定义f函数:移除栈底元素并返回该值
Reverse函数:若栈为空,return,然后调用f函数,再执行reverse函数,压入栈中
规定1和A对应、2和B对应、3和C对应...
那么一个数字字符串比如"111",就可以转化为"AAA"、"KA" 和"AK"。
给定一个只有数字字符组成的字符串str,返回有多少种转化结果。(leetcode42)
0—i-1位置已经确定
- [i]==0?返回:无效,没有办法比较
- [i]!=0 [i]>3 , i位置只能是C,没办法与i+1位置结合;
- [i] ==1 ,第一种:i自己作为单独的部分,后续有多少种方法;第二种:i位置与i+1位置结合(前提是i+1位置没有超过str的长度),看i+2后续有多少种
- [i] ==2, 第一种:i自己作为单独的部分,后续有多少种方法;第二种:i位置与i+1位置结合(前提是i+1位置没有超过str的长度,并且str[i+1]的数大于等于0,小于6),看i+2后续有多少种
给定两个长度都为N的数组weights和values, weights [i]和values[i]分别代表i号物品的重量和价值。给定一个正数bag,表示一个载重bag的袋子,你装的物品不能超过这个重量。返回你能装下最多的价值是多少?
当前货物i得重量和剩余容量做比较
选择:可变参数形式少