题解 | #数组中的逆序对#

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

package main

import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组
 * @return int整型
 */
func InversePairs(nums []int) int {
	// write code here
	divide(nums)
	return count
}

var count int = 0

func divide(nums []int) []int {
	if len(nums) <= 1 {
		return nums
	}
	mid := len(nums) / 2
	ll := divide(nums[0:mid])
	lr := divide(nums[mid:])
	return merge(ll, lr)
}
func merge(ll, lr []int) []int { //标准的合并方法
	dummy := []int{}
	lv, rv := 0, 0
	for lv < len(ll) && rv < len(lr) { //升序排列,之前卡了很久,不知道怎么处理不等长数列,原来是,lv,lr的进位可以保证前的的都是小数,则后面多的大数就可以自动接上去,不用排序。
		if ll[lv] <= lr[rv] {
			dummy = append(dummy, ll[lv])
			lv++
		} else {
			count += (len(ll) - lv) //第n位lr还大,n位为该数列最小值,那么n位后面的数都比lr大
            fmt.Println(count)
            count=count% 1000000007 //防止大数溢出,1^9+7,坑了我好久
			dummy = append(dummy, lr[rv])
			rv++
		}
	}
	for lv < len(ll) {
		dummy = append(dummy, ll[lv])
		lv++
	}
	for rv < len(lr) {
		dummy = append(dummy, lr[rv])
		rv++
	}
	return dummy
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务