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]交換過來,這個交換的過程,每交換一次,就是一個逆序對的“正序”過程。

歸併排序

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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章