题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
对于50\%50%的数据,size\leq 10^4size≤104
对于75\%75%的数据,size\leq 10^5size≤105
对于100\%100%的数据,size\leq 2*10^5size≤2∗105
输入描述:
题目保证输入的数组中没有的相同的数字
示例1
输入
[1,2,3,4,5,6,7,0]
返回值
7
思路
归并排序的改进
把数据分成前后两个数组(递归分到每个数组仅有一个数据项),
合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,count += mid+1 - i
代码
function mergeSort(data,start,end,array){
let res = 0
if(start<end){
const mid = Math.floor((start+end)/2)
const left = mergeSort(data,start,mid,array)
const right = mergeSort(data,mid+1,end,array)
let i = start
let j = mid+1
let index = start
while(i<=mid && j<=end){
if(data[i]<=data[j]){
array[index++] = data[i++]
}else{
//合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,count += mid+1 - i
array[index++] = data[j++]
// start~mid中比data[j]大的数字
res+= mid-i+1
}
}
while(i<=mid){
array[index++] = data[i++]
}
while(j<=end){
array[index++] = data[j++]
}
for(let k=start;k<=end;k++){
data[k] = array[k]
}
res+=left + right
}
return res
}
function InversePairs(data)
{
if(data.length<2){
return 0
}
const res = mergeSort(data,0,data.length-1,[])
return res%1000000007
}
运行环境:Javascript_V8
运行时间:154ms
占用内存:18708KB