首页 > 其他分享 >【数组10】数组中的逆序对

【数组10】数组中的逆序对

时间:2022-11-22 12:03:02浏览次数:32  
标签:10 nums int len start 数组 -- copy 逆序


题目描述


在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 


public class Solution {
public int InversePairs(int [] nums) {
if(nums==null ||nums.length<=0)
return 0;
int len=nums.length;
int[] copy=new int[len];
for(int i=0;i<len;i++)
copy[i]=nums[i];

int count=InversePairsCore(nums,copy,0,len-1);
return count%1000000007 ;
}

private int InversePairsCore(int[]nums,int[] copy,int start,int end){
//只有一个数的时候
if(start==end){
copy[start]=nums[start];
return 0;
}
//分成两对
int len=(end-start)/2;
//求出各个子数组的逆序对,使用递归
int left=InversePairsCore(copy,nums,start,start+len);
int right=InversePairsCore(copy,nums,start+len+1,end);
//再求两个数组一起的逆序对,使用归并排序
//从后往前
int i=start+len;
int j=end;
int copyIndex=end;
int count=0;
while(i>=start && j>=start+len+1){
if(nums[i]>nums[j]){
copy[copyIndex--]=nums[i--];
//逆序对个数即为另一个数组剩下数字个数
count+=j-start-len;
}else{
copy[copyIndex--]=nums[j--];
}
}
//剩下的数复制进去
for(;i>=start;i--)
copy[copyIndex--]=nums[i];
for(;j>=start+len+1;j--)
copy[copyIndex--]=nums[j];

return left+right+count;

}
}



标签:10,nums,int,len,start,数组,--,copy,逆序
From: https://blog.51cto.com/u_15886477/5877573

相关文章

  • 【数组11】和为S的两个数字
    题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例......
  • 【数组8】数字在排序数组中出现的次数
    题目描述统计一个数字在排序数组中出现的次数。publicclassSolution{publicintGetNumberOfK(int[]array,intk){if(array==null||array.length<=0)......
  • 【数组9】数组中只出现一次的数字
    题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。更好的方法://num1,num2分别为长度为1的数组。传出参数//将num1[0]......
  • 【数组7】把数组排成最小的数
    题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323......
  • 2022年11月10篇论文推荐
    随着最大的人工智能研究会议(NeurIPS2022)即将到来,我们进入了2022年的最后阶段。让我们回顾一下人工智能世界最近发生了什么。在介绍推荐论文之前,先说一个很有意思的项目......
  • golang算法-链表逆序
    前言链表逆序,表述的场景为:A->B->C->D逆序后:D->C>B>A分析需要插入数据,Insert方法需要打印数据,Print方法插入数据时,需要定位最后一个节点,LastNode方法最少需要两个偏移量......
  • php中的array_unshift() 新增一个元素在数组开头 -- 简单实现
    array_unshiftarray_unshift()函数在数组开头插入一个或多个元素。被加上的元素作为一个整体添加,这些元素在数组中的顺序和在参数中的顺序一样。该函数会返回数组中元素......
  • PAT乙级 —— 1002 数字分类 (20)
    题目链接:​​数字分类(20)​​题目描述给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1=能被5整除的数字中所有偶数的和;A2=将被5除后余1的数字按给出顺......
  • PAT乙级 —— 1004 福尔摩斯的约会 (20)
    题目链接:​​福尔摩斯的约会(20)​题目描述大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE2984akDfkkkkggEdsbs&hgsfdkd&Hyscvnm”。大侦探很快就明白......
  • PAT乙级 —— 1003 数素数 (20)
    题目链接:​​数素数(20)​​题目描述令Pi表示第i个素数。现任给两个正整数M<=N<=10000,请输出PM到PN的所有素数。输入描述:输入在一行中给出M和N,其间以空格分隔。输出描......