zoukankan      html  css  js  c++  java
  • JZ35 数组中的逆序对

    数组中的逆序对

    题目:

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

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

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

    考虑一下,逆序是说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
    }
  • 相关阅读:
    发布SpringBoot项目到Docker容器
    Docker网络
    Docker镜像发布到阿里云
    Docker制作Tomcat镜像
    DockerFile指令
    Docker命令
    kafka安装与使用
    刷题第2天
    刷题第1天
    UVA 11107 Life Forms
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14640524.html
Copyright © 2011-2022 走看看