码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode [315. 计算右侧小于当前元素的个数]

时间:2020-07-11 19:10:27      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:很多   一个   整数   连续   树状   需要   不重复   序列   tco   

(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

当然这道题的第二种解法是归并排序加树状数组,原理都差不多,我只是把归并排序又写了一遍(懒)

leetcode [315. 计算右侧小于当前元素的个数]

标签:很多   一个   整数   连续   树状   需要   不重复   序列   tco   

原文地址:https://www.cnblogs.com/Beic233/p/13284818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!