中级提升-1-P19
绳子覆盖数组节点(窗口不回退)
思路:大于等于某个值的最左位置。
右边界为截止节点,判断左边的位置数。
N*logN
思路:滑动窗口。左边界为开始节点。
O(N)
6/8袋子买苹果(打表法)
特点:Input -> Int, output -> Int
先/后手吃草问题(打表法)
打表法:
递归体:子过程的“后手” == 母过程的“先”手
防溢出:
RG颜色染色(预处理数组技巧)
思路:左侧从0开始不断扩大,判断左右侧要多少个染色。
思路:预处理。arr[0..i] 有多少个 R,arr[i..N-1] 有多少个G。
左侧都是 G,右侧都是 R。
边框全为1的最大正方形(数组预处理)
思路:row-col-border 确定唯一的正方形。确定正方形后又需要四个并列的for循环判断四条边的值是否全为1,此时验证四条边可以用数组预处理。
right数组定义:每一行从右往左,包含自身,有多少个连续的1。
down数组定义:每一列从下往上,包含自身,有多少个连续的1。
验证三个点,四条边右侧/下侧为1的数量。
随机数生成器加工
思路:1~5实现0~1的随机发生器,然后按位运算实现0~6的随机发生器,最后返回值加1。
0~6 用二进制表示最多需要3个位置。
a~b 等概率加工成 c~d 等概率
p 概率 0,1-p 概率 1 加工成 0~1 等概率
中级提升-2-P20
n节点构成二叉树数量
leftNum <= n - 1
完整括号字符串
思路:
- 先解决一个括号字符串是否是完整字符串
判断一个字符串是否是完整字符的标准:(一次遍历,遇到 ‘(‘ 时 cnt++,遇到 ‘)’ 时 cnt—。)
- cnt 在遍历过程中不能小于0;
- 遍历结束是 cnt 必须等于 0。
数组差值k的去重数字对
思路:
- 哈希表。
集合元素转移magic操作
avg(A) == avg(B)。都不能拿。
avg(A) < avg(B),不能从 A 拿到 B。
avg(A) > avg(B),从 A 中可以拿到 B,拿的元素 avg(B) < x < avg(A)。
Q:如果可以拿的元素有多个,应该怎么选?(拿最小的)
从 A 中拿满足要求最小的元素到 B,使 avg(A) 涨幅尽可能,avg(B) 涨幅尽可能小,这样可进行 magic 操作的次数会更多。