复盘|第325场周赛
到目标字符串的最短距离
【遍历】遍历每个words[i],如果它等于target,那么用min(|i-startIndex|,|n-i-startIndex|)更新答案的最小值。
每种字符至少取 K 个
【双指针】取的字符是前缀+后缀,先从右往左遍历找到最短的满足要求的后缀。枚举前缀长度的同时,维护后缀长度。
礼盒的最大甜蜜度
【贪心 + 二分】由于随着甜蜜度的增大,能选择的糖果数量变小,有单调性,所以可以用二分答案来做。对price从小到大排序,二分答案d。最小的数x可以选,下一个可以选的数是第一个≥x+d的数,依此类推。如果可以选的数<k,说明d取大了,否则说明d取小了,根据这一点来二分。 二分上界可以取(price[-1] - price[0]) // (k - 1) + 1。
好分区的数目
【01背包】逆向考虑坏分区的数目,定义f[i] [j]表示从前i个数中选择若干元素,和为1的方案数。不选第i个数:f[i] [j] = f[i-1] [j],选第i个数:f[i] [j] = f[i - 1] [j - nums[i]]。