首页 > 编程语言 > 详细

JZ35 数组中的逆序对

时间:2021-04-10 15:39:45      阅读:20      评论:0      收藏:0      [点我收藏+]

数组中的逆序对

题目:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 (题目保证输入的数组中没有的相同的数字)

对于50\%50%的数据,size\leq 10^4size104
对于75\%75%的数据,size\leq 10^5size105
对于100\%100%的数据,size\leq 2*10^5size2?105

思路:排序--计算交换次数

考虑一下,逆序是说a[i]>a[j],i < j。那么在排序的过程中,会把a[i]和a[j]交换过来,这个交换的过程,每交换一次,就是一个逆序对的“正序”过程。

归并排序

func InversePairs(nums []int) int {
    res :=  mergeSort(nums, 0, len(nums)-1) % 1000000007
    return int(res)
}

func mergeSort(nums []int, start, end int) int64 {
    if start >= end {
        return 0
    }
    mid := start + (end - start)/2
    cnt := mergeSort(nums, start, mid) + mergeSort(nums, mid + 1, end)
    tmp := []int{}
    i, j := start, mid + 1
    for i <= mid && j <= end {
        if nums[i] <= nums[j] {
            tmp = append(tmp, nums[i])
            cnt += int64(j - (mid + 1))
            i++
        } else {
            tmp = append(tmp, nums[j])
            j++
        }
    }
    for ; i <= mid; i++ {
        tmp = append(tmp, nums[i])
        cnt += int64(end - (mid + 1) + 1)
    }
    for ; j <= end; j++ {
        tmp = append(tmp, nums[j])
    }
    for i := start; i <= end; i++ {
        nums[i] = tmp[i - start]
    }
    return cnt
}

 

JZ35 数组中的逆序对

原文:https://www.cnblogs.com/dingxiaoqiang/p/14640524.html

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