首页 > 其他 > 详细

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

时间:2020-07-11 18:56:02      阅读:44      评论:0      收藏:0      [点我收藏+]

(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. 计算右侧小于当前元素的个数]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!