Url : https://leetcode.com/problems/count-of-smaller-numbers-after-self/
You are given an integer array nums and you have to return a new counts array. The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].
Example:
Input: [5,2,6,1]
Output: [2,1,1,0]
Explanation:
To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.
解題思路:
該題感覺是逆序對的一個變種,我們再解決逆序對的問題上做一個關係映射,記錄之前元素在什麼位置,然後將逆序對的值增加到相應的位置即可。
代碼:
func countSmaller(nums []int) []int {
len := len(nums)
numsHelper := make([]int,len)
count := make([]int,len)
indexMap := make([]int,len)
for i:=0;i<len;i++{
indexMap[i] = i
}
indexMapHelper := make([]int,len)
mergeSort(nums,numsHelper,0,len-1,count,indexMap,indexMapHelper)
return count
}
func mergeSort(nums []int,numsHelper []int,start int,end int, count []int,indexMap []int,indexMapHelper []int) {
if start >= end {
return
}
mid := (start+end)/2
mergeSort(nums,numsHelper,start,mid,count,indexMap,indexMapHelper)
mergeSort(nums,numsHelper,mid+1,end,count,indexMap,indexMapHelper)
i:=start
j:=mid+1
tmpCount := 0
k := start
for ;i<=mid&&j<=end; {
if nums[i] > nums[j] {
numsHelper[k] = nums[j]
tmpCount++
indexMapHelper[k] = indexMap[j]
j++
} else {
numsHelper[k] = nums[i]
count[indexMap[i]] += tmpCount
indexMapHelper[k] = indexMap[i]
i++
}
k++
}
for ;i<=mid;i++ {
numsHelper[k] = nums[i]
count[indexMap[i]] += tmpCount
indexMapHelper[k] = indexMap[i]
k++
}
for ;j<=end;j++ {
numsHelper[k] = nums[j]
indexMapHelper[k]= indexMap[j]
k++
}
for m := start;m<=end;m++ {
nums[m] = numsHelper[m]
indexMap[m] = indexMapHelper[m]
}
}