LeetCode-30
162. 寻找峰值
1 | class Solution { |
1901. 寻找峰值 II
1 | class Solution { |
贪心,从某一点开始,如果上下左右存在比当前点大的数,移动过去,直到无法移动
746. 使用最小花费爬楼梯
1 | class Solution { |
1 | class Solution { |
2415. 反转二叉树的奇数层
1 | class Solution { |
1631. 最小体力消耗路径
超时
1 | class Solution { |
优化
dijkstra需要用优先队列优化一下
1 | class Solution { |
LCR 078. 合并 K 个升序链表
- 方法和和并两个升序链表相同,k个链表每次从k个指针中选择出值最小的一个插入到总链表中
- 使用优先队列可以把算法优化到
O(k*log(k))
1 | /** |
2866. 美丽塔 II
枚举山峰
1 | class Solution { |
单调栈
- 还是不会单调栈,明天开学单调栈!
2048. 下一个更大的数值平衡数
排列组合
- 若平衡数为d位数,将d拆成若干个不相等的数
- 如:6可以拆成,
6
,2+4
,1+5
,1+2+3
- 他们分别对应,
666666
,224444
,155555
,122333
以及他们的排列组合
- 如:6可以拆成,
- 求出所有排列组合,找到大于n的最小排列
- 由于一个数的下一个平衡数的位数可能大于他,需要考虑相邻两位的情况
1 | class Solution { |
打表
- 生成所有满足条件的数
1 |
|
1 | class Solution { |
1671. 得到山形数组的最少删除次数
dp
- 不会,抄答案
arr1[i]
表示0..(i-1)
中小于nums[i]
的元素个数arr2[i]
表示(i+1)..(len)
中小于nums[i]
的元素个数arr1[i] + arr2[i] + 1
表示以i
为山峰的山状数组长度
1 | class Solution { |
1962. 移除石子使总数最小
模拟
ac代码
1 | class Solution { |
优化模拟
- 一边减少一边算最终结果
1 | class Solution { |
时间100%
- 看了时间100%的方法,由于数字最大是10000,可以创建一个长度为10000+1的bool数组
- 从下标最大到最小,选择存在于原数组的下标(bool数组置为true),除二,并把剩余部分设置为true
- 这样就可以起到和优先队列一样的效率
代码
1 | class Solution { |
这个代码跑是错的,因为没有考虑同一个数出现多次的情况,所以不能使用bool数组
1 | class Solution { |
1954. 收集足够苹果的最小花园周长
枚举
- 刚开始看错题了,认为只计算正方形的边上的苹果数
- 推导出当边长为
2*radius
时,边上的苹果数目为4*radius + 8*radius + 4*3*radius*(radius-1)
- 枚举边长并将边上的苹果加起来,直到超过需要的苹果即可
公式推导
- bfs的思想
- 边长为0的所有点
(0,0)
的子节点,分为两类是|x| + |y| = 1
(1, 0), (0, 1), (-1, 0), (0, -1)|x| + |y| = 2
(1, 1), (1, -1), (-1, 1), (-1, -1)
- 点可能存在两种子节点,一种节点会让
|x| + |y|
增大1,另一种会增大2- 四个角上的子节点会增大二,四个角上的子节点有增大2和增大1的
- 非四个角上的子节点只会增大1
- 四个角上的节点的
|x| + |y| = 2*radius
孵化子代- 产生4个增大2的,也就是公差为2的,也就是
4*2*radius
- 产生8个增大1的
- 产生4个增大2的,也就是公差为2的,也就是
- 剩余节点孵化子代
- 只会产生一个公差为1的
- 再统计边长为1的所有点的子节点,可以发现,当半径为
radius
时:|x| + |y| = radius
的有 4 个|x| + |y| = radius + i
,i = 1, 2, ..., radius-1
的各有8个|x| + |y| = 2*radius
的有4个
- 总和为:
4*radius
- $ 8 \times \sum_{i=radius+1}^{2*radius-1}{i} = \frac{(3 \times radius)\times(radius-1)}{2} \times 8$
4*2*radius
- 将以上三部分求和,得到 $ 4radius + 8radius + 12radius(radius - 1)$
代码
1 | class Solution { |
二分
- 将上面的公式再次推导,即可得到对于半径为radius的正方形上以及其内部,共有苹果
- $ 2radius(radius+1)(2radius+1) $
- 然后就能愉快的二分啦
1 | class Solution { |