复盘|第321场周赛
找出中枢整数
【公式】等差数列求和公式1-x 是 x(x + 1)//2,x-n是(n(n + 1) - x(x - 1)) // 2,两式相等.
追加字符以获得子序列
【双指针+贪心】贪心思想,双指针遍历s和t,t[j]应匹配i尽量小(但大于上一个的匹配的位置)的s[i]。
从链表中移除节点
【递归】递归本质就是在倒着遍历链表。定义递归函数返回的头节点是最大值,比较当前head和处理完的head.next,如果后面大,就保留后面。如果前面大那无事发生,把head接到后面的部分上。
统计中位数为 K 的子数组
【前缀和思想】先推导,奇数长度时(偶数长度时加一),小于k的个数(+1)=大于k的个数 等价转换 左侧小于k的个数 + 右侧小于k的个数(+1) = 左侧大于k的个数 + 右侧小于k的个数,移项,左侧小于k的个数 - 左侧大于k的个数(+1) = 右侧大于k的个数 - 右侧小于k的个数。小于k的数看成-1,大于k的数看成1,k看成0。设k的下标为pos,k为子数组的中位数,等价于:1.子数组包含下标pos;2.子数组的元素和等于0或1。统计子数组nums[pos:i]中比k大的数的个数,减去比k小的数的个数,记作c_i。用哈希表cnt统计c_i的个数。然后对于子数组nums[i:pos],统计比k小的数的个数,减去比k大的数的个数,记作c。对于每个i:[cnt_ci]]就是符合条件的奇数长度子数组的个数;cnt[c_i + 1]就是符合条件的偶数长度子数组的个数。累加个数,即为答案。代码中cnt[0] = 1是存了k。