美文网首页
20 - Hard - 计算右侧小于当前元素的个数

20 - Hard - 计算右侧小于当前元素的个数

作者: 1f872d1e3817 | 来源:发表于2018-07-03 18:19 被阅读0次

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

示例:

输入: [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1).
2 的右侧仅有 1 个更小的元素 (1).
6 的右侧有 1 个更小的元素 (1).
1 的右侧有 0 个更小的元素.

时间超限!!!

class Solution(object):
    def countSmaller(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums:
            return []
        _max = max(nums)
        _min = min(nums)
        _dict = {}
        res = []
        for i in nums[::-1]:
            _sum = 0
            for j in range(_min, i):
                if j in _dict:
                    _sum += _dict[j]
            if i not in _dict:
                _dict[i] = 0
            _dict[i] += 1
            res.append(_sum)
        return res[::-1]

Binary Indexed Tree

class BinaryIndexedTree(object):
    def __init__(self, n):
        self.sums = [0] * (n + 1)

    def update(self, i, val):
        while i < len(self.sums):
            self.sums[i] += 1
            i += i & -i

    def sum(self, i):
        r = 0
        while i > 0:
            r += self.sums[i]
            i -= i & -i
        return r


class Solution(object):
    def countSmaller(self, nums):
        hashTable = {v: i for i, v in enumerate(sorted(set(nums)))}

        tree, r = BinaryIndexedTree(len(hashTable)), []
        for i in xrange(len(nums) - 1, -1, -1):
            r.append(tree.sum(hashTable[nums[i]]))
            tree.update(hashTable[nums[i]] + 1, 1)
        return r[::-1]

相关文章

网友评论

      本文标题:20 - Hard - 计算右侧小于当前元素的个数

      本文链接:https://www.haomeiwen.com/subject/aepjuftx.html