问题描述
把数列中每个元素左边小于自身的元素加起来
如:
{1, 2, 3},2的左边只有1小于,3左边有1和2小于,加起来的小和值就是4
{
1,3,5,0,2,4}
1 3 5 | 0 2 4
1 3|5 0 2|4
1|3 0|2
这个其实是练习归并排序
已知归并过程如下:
- 首先划分划分划分,一直划分到不能划分,即每个组都只有一个数值。
- 然后合并,合并的过程就是每个二划分排序的过程。
- 在合并的时候,开辟一个辅助数组,其大小等于这两个合并数列的大小。
- 设置两个指针分别指向每个数列的首部,然后比较得到其中较小的值,并将这个值放入辅助数组中。然后取出小值的那个数列的指针可以继续向前走,与另一个数列的指针所指向的值继续比较
- 这样比较完成后,如果两个数列中有个数列的数值有剩余,即其指针没有走到末尾,则将这个数列直接赋到辅助数组末尾即可。
- 然后将辅助数组中的值拷贝回原数组中刚才合并的那两个数列的位置上。
其实就是在每次归并排序的时候计算小于的和
count += a[p1] < a[p2] ? (r - p2 + 1)*a[p1] : 0;
java:
import java.io.*;
class test
{ public static int