(https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/)
可以这样想:我们把nums数组中的数都放在数轴上,那么我们根据某个数,看他数轴前边有多少个数就可以得到对应的count,这样会存在三个问题:
问题一:怎么保证数轴前面的数都在nums[i]的右边
答:对nums数组进行从后往前遍历就行了
问题二:既然要把nums中的数分散到数轴中对应的位置,虽然我们可以用一个桶来代替数轴,但是如果nums中有一个数很大,我们这个桶就会变得很大,这样就会MLE,该怎么办?
答:因为nums数组不会很大,所以我们可以对数组进行离散化。这个也是我今天所学到的东西,什么叫离散化呢,官方题解中有一句话解释的非常到位:离散化的方法有很多,但是目的是一样的,即把原序列的值域映射到一个连续的整数区间,并保证它们的偏序关系不变。在普通的桶来代替数轴的过程中,下标与桶里存方的数是一样的,而我们可以稍微变化一下,将nums中不重复的数进行排序得到数组a,这样我们就得到了数与下标的一种关系,那么求nums中某个数的数轴下标就可以对a进行二分查找得到下标啦!
问题三:对于离散化后,我们得到了一个排列紧密的数轴,那么对于某个数,他在数轴的前缀和就是最后的答案,然后需要更新自己所在下边的数目,我们感觉得到,这个数组是在动态变化的,而我们要求多次动态数组的前缀和,可以想到树状数组,如果没有接触过树状数组,可以看这篇文章,我觉得写得很好:https://www.cnblogs.com/findview/p/11281628.html
当然这道题的第二种解法是归并排序加树状数组,原理都差不多,我只是把归并排序又写了一遍(懒)