📅  最后修改于: 2023-12-03 15:23:38.166000             🧑  作者: Mango
有一个链接列表,需要将每个节点替换为其“超越者计数”,即链中比当前节点的值大的节点数量。
例如,给定以下链接列表:
2 -> 5 -> 3 -> 7 -> 8 -> 1 -> 9
每个节点的“超越者计数”如下所示:
2(0) -> 5(1) -> 3(1) -> 7(2) -> 8(3) -> 1(0) -> 9(1)
这里是一种实现“超越者计数”的算法:
class ListNode:
def __init__ (self, val=0, next=None):
self.val = val
self.next = next
def countSmaller (head: ListNode) -> List[int]:
# 统计长度
n = 0
p = head
while p:
n += 1
p = p.next
# 辅助数组
ans = [0] * n
# 逆序遍历链表
stack = []
p = head
i = n - 1
while p:
while stack and stack[-1] < p.val:
stack.pop()
ans[i] += 1
i -= 1
stack.append(p.val)
p = p.next
i -= 1
return ans
这个算法的时间复杂度是 O(n),其中 n 是链表的长度。
如果要将链表中的每个节点替换为其“超越者计数”,可以使用以下代码:
def replaceNodes (head: ListNode) -> ListNode:
counts = countSmaller(head)
p = head
i = 0
while p:
p.val = counts[i]
p = p.next
i += 1
return head
这里使用了 countSmaller
函数来计算“超越者计数”,然后遍历链表将每个节点的值替换为其“超越者计数”。
如果输入的链表是 2 -> 5 -> 3 -> 7 -> 8 -> 1 -> 9
,则输出的链表应该是 0 -> 1 -> 1 -> 2 -> 3 -> 0 -> 1
。