复盘|第78场双周赛
找到一个数字的 K 美丽值
【模拟】枚举所有长为 k 的子串。
【数学】不断取最低的 k 位数字,判断后,去掉末尾数字,不断循环直到不足 k 位数字。
分割数组的方案数
【枚举 + 前缀和】枚举所有分割位置,找到其中的合法分割。
也可以不计算右边,左边×2如果大于总和等同于左边大于右边。
毯子覆盖的最多白色砖块数
【排序 + 双指针】tiles按左端点l_i排序后,枚举毯子的摆放位置,计算毯子能覆盖多少块瓷砖。毯子右端点放在一段瓷砖中间不如放在瓷砖右端点,因此可以枚举每段瓷砖的右端点来摆放毯子的右端点。双指针,left需要满足其指向的那段瓷砖的右端点被毯子覆盖,设毯子右端点在瓷砖段i上,则毯子左端点是tiles[i] [i] - carpetLen + 1,left需要满足tiles[left] [1] ≥tiles[i] [1]−carpetLen+1。如果毯子左端点在tiles[left]内部,覆盖的瓷砖数还需要额外减去这段瓷砖没被覆盖的部分,即减去(tiles[i] [1]−carpetLen+1) - tiles[left] [0]。
最大波动的子字符串
【DP】最大波动值只有s中两种字符决定,但不确定是哪两种,所以可以枚举这两种字符的所有可能值,从26个小写字母中选两个一共A(26,2) = 26*25 = 650种组合。将出现最多的字符视为1,出现最少的字符视为-1,其余字符视为0,本题就类似 最大子数组和问题了。ab必须都出现在子串中,用diff记录ab出现次数之差,初始值为0,用diffwithb记录包含b的a和b出现次数之差,初始为-∞。遍历s,遇到a,diff和diffwithb都加以,遇到b,diff - 1,diffwithb = max(0, diff)。ans = max(diffwithb),s只有一种字符则ans=0。注:遍历s的时候可以把s[i]当作a或b,减少枚举次数。