JZ35 数组中的逆序对

数组中的逆序对

题目:

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

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

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

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

归并排序

const kmod = 1000000007

func InversePairs(nums []int) int {
	// write code here
	if len(nums) <= 1 {
		return 0
	}

	return mergeSort(nums, 0, len(nums)-1) % kmod

}

func mergeSort(nums []int, start, end int) int {
	if start >= end {
		return 0
	}

	mid := start + (end-start)/2

	count := mergeSort(nums, start, mid)
	count += mergeSort(nums, mid+1, end)
	count += merge(nums, start, mid, end)
    return count
}

func merge(nums []int, start, mid, end int) int {
	tmp := make([]int, 0)
	i, j:= start, mid+1
    cnt := 0
	for i <= mid && j <= end {
		if nums[i] > nums[j] {
			tmp = append(tmp, nums[j])
			cnt += (mid - i + 1)
			j++
		} else {
			tmp = append(tmp, nums[i])
			i++
		}
	}

	tmp = append(tmp, nums[i:mid+1]...)
	tmp = append(tmp, nums[j:end+1]...)

    for i := start; i <= end; i++ {
        nums[i] = tmp[i - start]
    }

    return cnt
}

  

posted @ 2021-04-10 12:37  zqlucky  阅读(76)  评论(0编辑  收藏  举报