复盘|第359场周赛
判别首字母缩略词
【模拟】需要满足两个条件:words长度和s长度相等;所有words[i] [0] == s[i]。
k-avoiding 数组的最小总和
【数学】对于每个数i,数对(i, k - i)里只能选小的那个。可以发现答案数组分为前后两段,第一段是[1: min(⌊k / 2⌋, n)],第二段从k开始往后选,还需n - m个数,是[k : k + n - m - 1],分别用等差数列求和公式求和再相加。
销售利润最大化
【线性DP】定义f[i] 为前i座房子的最大收益,转移方程为f[i] = max(f[i - 1], f[start_j - 1] + gold_j for start_j, gold_j in g if end_j == i),提前把所有end相同数据用哈希表归类。(为避免负数,i改成i + 1)
找出最长等值子数组
【分组 + 双指针】把相同元素的下标记录到哈希表或数组pos中,遍历pos中每个下标列表ps,用双指针处理,如果等值子数组的元素下标是从ps[l]到ps[r],该子数组需要删除的元素是ps[r] - ps[l] + 1 - (r - l + 1),需删除的元素如果>k则需要移动做指针。进一步优化:再哈希表或数组中直接记录ps[i] - i,这样删除元素数量 就是ps[r] - ps[l]。