Skip to main content

315. Count of Smaller Numbers After Self

https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

Python

Brute Force (Timelimit Exceed)

Time: O(N^2) Space: O(N)

class Solution:
def countSmaller(self, nums: List[int]) -> List[int]:
mapper = []
for i in range(len(nums)):
count = 0
for j in range(i+1, len(nums)):
if nums[j] < nums[i]:
count += 1
mapper.append(count)
return mapper

Segment Tree

M = 2 * (10**4)

Time: O(NlogM) Space: O(M)

class Solution:
def countSmaller(self, nums: List[int]) -> List[int]:
size = 2 * 10**4 + 1
tree = [0] * (2*size)

def update(i, value):
i += size
tree[i] += value
while i > 1:
i >>= 1
tree[i] = tree[i*2] + tree[i*2+1]

def query(left, right):
left, right = left+size, right+size
result = 0

while left < right:
if left % 2 == 1:
result += tree[left]
left += 1
left >>= 1

if right % 2 == 1:
right -= 1
result += tree[right]
right >>= 1

return result

offset = 10**4
ans = []

for num in reversed(nums):
ans.append(query(0, num+offset))
update(num+offset, 1)

return ans[::-1]

Fenwick Tree

(TODO)