文章目录
- 1.问题重述
- 2.示例介绍
- 3.思路分析
- 4.代码讲解
1.问题重述
这个题目和之前的那个逆序对的题目有异曲同工之妙,之前的那个是逆序对的个数,逆序对就是统计的我们的这个前面的元素大,后面的元素小的这样的数据组合的个数,但是这个题目需要我们统计出来这个具体你的后面多少个元素比你小,我们需要返回的这个数组是该位置后面小元素的个数;
2.示例介绍
首先我们看一下这个示例一:5的后面有两个元素是比5小的,因此这个5对应的小标返回值就是2,这个2代表的就是这个5的后面两个元素比5小,同理这个返回的数组里面的第二个元素2表示的是nums数组里面2后面有一个元素比2小,这个返回数组里面的第三个元素1,代表6的后面有一个元素比1小,0表示1的后面有0个元素比1小,这个肯定的啦,因为这个1就是最后一个元素,他的后面压根就没有元素了;
3.思路分析
通过上面的这个分析,相信你也看到了,这个思路是不变的,但是我们需要统计这个对应元素的个数,所以这个题目我们需要引入一个index数组,这个数组里面记录的就是我们的当前位置元素后面的小元素(比自己小)的个数;
之前我们介绍这个逆序对的时候,说的是升序和降序两个方案,在这个里面我们只能使用降序,因为这个题目需要我们统计的就是这个当前的元素的后面,多少个元素是比我们自身小的;
降序的话,实际上就是这个数组前面的元素大,后面的元素小,这个是需要我们明确的,cur1<cur2(指的是对应位置下标的元素)的时候,cur2++,因为我们要找到的是这个数组里面后面比我小的元素;
cur1>cur2的时候,我们的这个cur1一定是第一次比我们的这个cur2对应位置的元素大,这个时候对应位置下标的元素就是cur2后面的元素的个数,因为这个数组里面的元素都是降序排列的;
但是我们需要注意的是,在这个归并的过程中,我们的nums数组里面的数据的挪动,必然会引起这个iundex数组里面的元素的挪动,因为这个index数组里面统计的是这个nums数组里面的对应元素后面的小元素的个数,所以当我们的在这个nums数组里面的元素挪动的时候,这个index必须要跟着进行变化才是可以的,他们之间的这个关系就是一一对应的;
4.代码讲解
我们的数据在这个操作的过程中都是按照数组元素的方式进行处理的,但是我们的这个最后的返回值是一个list,因此我们最后把最终处理结果的这个数组里面的元素挨个的放进去就可以了;
这个里面出现的temp相关的都是临时数组,最后需要挪动到我们的正式数组里面,正式数组里面的元素最后需要搞到我们的list列表里面去作为一个返回值,这个就是整体的数据类型之间的操作流程;
接下来我们看一下这个整体的方法:
首先就是关于这个里面的数组的创建,需要创建我们需要的这个数组,对于这个index数组进行初始化的操作,17-21就是把我们的数组里面的元素放到这个列表里面去,作为返回值;
这个里面的39行使最核心的,这个index里面存放的这个移动过程中我们的数组的小标,因此这个right-cur2+1需要加到这个ret里面的这个对应的位置,这个对应的位置怎么找到呢,就是通过我们的这个index里面的这个对应位置元素,就是他的真实的下标,这个是最主要的一环,其他的操作都是我们的归并排序里面的常规操作;
最后的这个45-56行里面的这个逻辑也是很容易进行理解的,就是我们的这个排序的过程中,因为本来剩下的两个部分里面的元素都是有序的,我们直接平移挪动过去就可以了,最后的这个53-56里面的这个内容就是把这个temp数组里面的元素放到我们的这个正式数组里面去;