小和问题和逆序对问题

小和问题

 笨办法:每个位置左边都遍历一下,时间复杂度O(n²),额外空间复杂度O(1)。

解决思路

a. 将当前序列分为两个子序列,分别求其小和
b. 对a划分得到的两个子序列进行merge操作,得到合并过程产生的小和,再加上a得到的两个子序列的小和之和
c. 递归地执行a和b

merge操作采用二路归并排序的思想
求一个数组的小和,可以转化为求每个元素在小和累加过程出现的次数,然后将当前元素与出现次数相乘,累加得到小和
假设当前元素为a,a右边比a大的元素个数则为a在小和累加过程出现的次数

实现过程

时间复杂度O(nlogn)额外空间复杂度O(n)

实现代码

 https://github.com/superjishere/algorithm/blob/master/zuo/%E5%88%9D%E7%BA%A7/01/Code_12_SmallSum.java

逆序对问题

解决思路

与小和问题类似,只不过这里找的是左边比右边大的数。

原文地址:https://www.cnblogs.com/superjishere/p/12288426.html