分治拆分别重复算中点
场景:~/work/rec/dsum.cpp 用分治求闭区间 [l, r] 的和,结果总是偏大,有的询问还会崩溃。 任务:修好拆分的那一句,让每个元素只被算一次。make 编译后用 sample.txt 自测;check 会用随机数组和随机
记忆化数组要先初始化
场景:~/work/rec/stairs.cpp 用记忆化递归数走楼梯的方法(一次走 1、2 或 3 级),可所有答案都是 0。 任务:修好它:用 -1 表示「还没算过」,那就得先把整个 memo 填成 -1。make 编译后用 sampl
补写分治求区间最大值
场景:~/work/rec/dmax.cpp 按询问求半开区间 [l, r) 的最大值,dmax 的拆分合并还没写。 任务:补全 dmax。make 编译后用 sample.txt 自测;check 会用随机数组(包括全是负数的)和随机区间
暴力双循环在做什么
第 1 步:i 在第 1 个:j 配了 4 次 第 2 步:i 在第 2 个:j 配了 3 次 第 3 步:i 在第 3 个:j 配了 2 次 第 4 步:两层循环:配对数随 n² 增长 13 15 17 23 24 i j 两层嵌套循环遍
为什么说它浪费
说暴力双循环「浪费」,是因为【0】。
什么样的双循环能优化
一个双循环能优化成 O(n),通常是因为【0】。
双指针为什么能到 O(n)
双指针的复杂度是 O(n),因为【0】。
用双指针通常要什么前提
能用双指针,通常要求数据【0】。
两两配对要试几次
运行下面这段程序: #include <algorithm> #include <iostream> #include <map> #include <string> #include <
对撞双指针怎么走
第 1 步:找两个数加起来是 40 第 2 步:13+24=37 小了:lo 右移 第 3 步:15+24=39 小了:lo 右移 第 4 步:17+24=41 大了:hi 左移 第 5 步:17+23=40:找到了 13 15 17 23