Count of Smaller Numbers After Self

还是个比较难的题,首先O(n^2)的算法大数据会超时,然后这道题尝试了线段树还是无法解决问题(不知道是不是线段树的逻辑还是没缩减时间复杂度),最后只能参考归并排序的思路搞定了这道题,

class Solution(object):
    def countSmaller(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        n = len(nums)
        result = [0] * n
        mapping = list(enumerate(nums))

        self.mergeSort(mapping, 0, n, result)
        return result

    def mergeSort(self, nums, start, end, result):
        if start >= end - 1:
            return nums[start:end]

        mid = start + (end - start) / 2
        left = self.mergeSort(nums, start, mid, result)
        right = self.mergeSort(nums, mid, end, result)
        tmp = [0] * (len(left) + len(right))

        leftCur, rightCur = len(left) - 1, len(right) - 1
        tmpCur = leftCur + rightCur + 1
        while leftCur >= 0 and rightCur >= 0:
            if left[leftCur][1] > right[rightCur][1]:
                tmp[tmpCur] = left[leftCur]
                result[left[leftCur][0]] += (rightCur + 1)
                leftCur -= 1
            else:
                tmp[tmpCur] = right[rightCur]
                rightCur -= 1
            tmpCur -= 1

        while leftCur >= 0:
            tmp[tmpCur] = left[leftCur]
            leftCur -= 1
            tmpCur -= 1

        while rightCur >= 0:
            tmp[tmpCur] = right[rightCur]
            rightCur -= 1
            tmpCur -= 1

        return tmp

results matching ""

    No results matching ""