复盘|第352场周赛
最长奇偶子数组
【双指针】l指针记录数组开头,r指针记录指针结尾。更新的时候碰到第一个不满足的元素,更新长度并重置子数组。
和等于目标值的质数对
【预处理 + 枚举】预处理10^6内所有质数,然后暴力枚举质数x和y=n-x,如果x≤y且y是质数,就把[x,y]加入答案。加个优化:如果n是奇数,因为奇数 = 奇数+偶数,而偶数中只有2是质数,如果n是奇数时,至多只有一个质数对(2, n - 2)。
不间断子数组
【滑动窗口】遍历数组的同时,维护窗口内的数字,用哈希表或平衡树维护。如果窗口内最大值与最小值的差大于2,就不断移动左端点l,减少窗口内的数字。
所有子数组中不平衡数字之和
【O(n^2) 枚举】题中n至多为1000,可以从左到右枚举子数组左端点i,然后从i+1开始向右枚举子数组右端点j,一边枚举j,一边维护不平衡度cnt:如果x=nums[j]之前出现过,那么排完序后与另一个x相邻,cnt不变;如果x之前没出现过,那么看x+1和x-1出现过没,都出现了cnt--,都没出现cnt++,只出现过1个cnt不变。代码中vis数据可以用时间戳标记。
【O(n) 贡献法】两次遍历,第一次遍历用r数组记录每个数字右侧最近的x和x-1的下标。第二次遍历中,对于每个位置i和其对应的数字nums[i]和r[i],计算贡献为(i - idx[x - 1]) * (r - i),但由于上述计算会多算每个子数组的最小值产生的贡献,所以需要减去n * (n + 1) // 2。