今天我们来做一下今天的leetcode上一道中等题
题目链接在这里#### 2121. 相同元素的间隔之和
题意
题目给了我们了一个数组,让我们求其中的一个数字和其他所有位置的相同数字的间隔之和。
什么意思呢? 假如这个数组是 2 1 3 1 2 3 3
求下标为2的数字3的间隔之和,就等于它和其他两个3的距离之和,也就是 等于 3 + 4 = 7
其他的每个数字都按照这个方法进行计算
思路
这道题读过题之后,感觉比较简单,但是一下子又想不到好的代码实现思路,这是我第一次做这道题的情景。😪
不过,还好后面坚持思考了一下,才明白一种解决的办法。话不多说,直接上图。
- 如上图所示,我们想要计算每一个3的间隔总和,首先我们可以统计出来3的所有位置信息,也就是2 5 6 7
- 然后,我们可以统计出来每个数字都出现在哪些位置了。之后,我们就可以开始计算间隔和了
- 我们发现第一个3的间隔总和比较好算,也就是从第2个3开始遍历后面的5 6 7,将他们和2的距离相加求和即可。
- 我们紧接着考虑计算第二个3的间隔总和,首先,把5和每个数(包含自己)的间隔画出来的话,就像图中那,在把2和每个数的间隔也画出来。从2的每个间隔 到 5的每个间隔 我们可以发现,左侧有一个间隔增加了 5-2,右侧三个间隔减少了5-2,增加和减少的间隔分别对应红色和绿色标注的线段;
- 继续,再观察5到6的变化,可以发现,左侧有两个增加了6-5,右侧有两个减少了6-5,。。。
- 当我们找到这些相邻位置的间隔和的变化规律时,我们可以总结如下
假设间隔数组为p,那么,第i个数的间隔和相对于第i-1个数增加了 = 增加量 - 减少量 = i*(p[i]-p[i-1]) - (n-i)*(p[i] - p[i-1]) = (2*i-n)(p[i]-p[i-1])
至此,我们就找到了计算一个数字的 每个位置的间隔和的规律了。😘
代码实现
了解了上面的思路之后,代码实现其实就非常简单了😎。
结束语
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄