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

数组中的逆序对

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
}

全部评论

相关推荐

昨天 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务