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.
------------------------------------------------------------------------------
The right code is :
class Solution:
def dfs(self, nums, res, start, end):
if (start > end):
return []
elif (start == end):
return [nums[start]]
mid = start + ((end - start) >> 1)
left = self.dfs(nums, res, start, mid)
right = self.dfs(nums, res, mid + 1, end)
sorted_tuples = [(0, 0) for i in range(end - start + 1)]
for i in range(end - start + 1)[::-1]:
if ((not right) or (left and left[-1][1] > right[-1][1])):
res[left[-1][0]] += len(right)
sorted_tuples[i] = left.pop()
else:
sorted_tuples[i] = right.pop()
return sorted_tuples
def countSmaller(self, nums):
l = len(nums)
res = [0 for i in range(l)]
self.dfs(list(enumerate(nums)), res, 0, l - 1)
return res
For merge sort, the time complexity is O(nlogn). O(logn) is the tree height, O(n) is merging complexity. I wrote an O(n^2logn) complexity firstly.