Skip to main content

rankTransformOfAnArray

class Solution:
def arrayRankTransform(self, arr: List[int]) -> List[int]:
seen = set()
minHeap = []
numToIdx = defaultdict(list)
for idx, num in enumerate(arr):
if num not in seen:
heapq.heappush(minHeap, num)
seen.add(num)

numToIdx[num].append(idx)


resp = [0] * len(arr)

currRank = 1
while minHeap:
currSmallest = heapq.heappop(minHeap)
for numIdx in numToIdx[currSmallest]:
resp[numIdx] = currRank

currRank += 1

return(resp)
class Solution:
def arrayRankTransform(self, arr: List[int]) -> List[int]:
# minHeap would be O(n) to build, then for every item (n) do O(log n) pop so O(n logn). O(n) SC
# copying array, sorting, and iterating would be O(n) + O(n logn) + O(n) with O(n) space

# O(2n)
minHeap = [(arr[idx], idx) for idx, num in enumerate(arr)]
heapq.heapify(minHeap)

# O(n logn)
currRank = 1
currElem = None
while minHeap:
num, idx = heapq.heappop(minHeap)
if currElem != None and currElem != num:
currRank += 1

arr[idx] = currRank
currElem = num

return(arr)
class Solution:
def arrayRankTransform(self, arr: List[int]) -> List[int]:
arrCopy = [(num, idx) for idx, num in enumerate(arr)]
arrCopy.sort(key=lambda x: x[0])

currRank = 1
currElem = None
for num, idx in arrCopy:
if currElem != None and currElem != num:
currRank += 1

currElem = num
arr[idx] = currRank

return(arr)