tiansuohaoer 在 Leetcode每日一题 —— 2916. 子数组不同元素数目的平方和 II 中发帖

思路
1. 转化贡献
假设一个子数组中出现的元素集合为 \{a,b,c,d...\},那么这个集合产生的贡献在数值上相当于集合中所有的元素二元组个数,即 (a,a),(a,b),\dots,(d,c),(d,d) 在这个集合中各产生 1 贡献。 
也就是说统计「所有子数组的不同元素个数平方和」在数值上相当于统计「每个子数组包含多少个元素二元组 (x,y) 」,即统计「每个元素二元组 (x,y) 被多少个子数组 a_{l...r} 包含」。 
2. 计算每个右端点的贡献
假设我们固定了右端点 r,其中包含元素二元组 (a,b),两者最后一次出现的位置分别为 p_a,p_b,那么包含这个二元组的左端点 l 需要在位置 \min(p_a,p_b) 及之前,即这个二元组产生了 \min(p_a,p_b) 的贡献。 
即对于一个固定的右端点 r,假设其中所有元素最后一次出现的位置集合为 \{p...
 
 
Back to Top