小和问题
笨办法:每个位置左边都遍历一下,时间复杂度O(n²),额外空间复杂度O(1)。
解决思路
a. 将当前序列分为两个子序列,分别求其小和
b. 对a划分得到的两个子序列进行merge操作,得到合并过程产生的小和,再加上a得到的两个子序列的小和之和
c. 递归地执行a和b
merge操作采用二路归并排序的思想
求一个数组的小和,可以转化为求每个元素在小和累加过程出现的次数,然后将当前元素与出现次数相乘,累加得到小和
假设当前元素为a,a右边比a大的元素个数则为a在小和累加过程出现的次数
实现过程
时间复杂度O(nlogn)额外空间复杂度O(n)
实现代码
逆序对问题
解决思路
与小和问题类似,只不过这里找的是左边比右边大的数。