315. Count of Smaller Numbers After Self


time: O(nlogn)
space: O(n)
這題認真去看可以發現, 其實主體就是 mergeSort, 但為什麼可以在 mergeSort 的過程中
達成 count 右邊比本身小的結果呢?
主要是要先利用一個 Item class, 來記錄原本的值和 index
還有利用一個 count 陣列, 來記錄最後的答案, 怎麼紀錄答案呢?
就是利用 Item class 裡面原本的值和 index
當第一個 while 時, 如果
merge 5, 2
1.
if (items[l].val > items[r].val) =>
a. 代表目前是逆序(左邊 大於 右邊), 所以要 右邊 要移到 左邊, 才會是 sorted, 以這來說就是 item[r++] 加到 temp
b. 但逆序也代表了一件事 => 右邊有一個數大於左邊, 所以 rightCount++
else 也就是 sorted, 那要做什麼呢? 就是要記錄結果到 count[] 陣列, 因為已經沒有右邊比左邊大的 case 了
a. 記錄結果到 count[] 陣列 .=> 這就要利用到 items[l].idx 了 so count[items[l.idx]] += rightCount
b. 把 l 目前內容加入, item[l++] 加到 temp
ex 5, 2 .=> 2, 5 ., rightCount++, 塞了 2 到 temp[0]

第二個 while 就跟 第一個 while else 其實內容一樣 ( 因為是 l <= mid)
ex 5 2 .=> 2, 5 之後, 還剩下 5, 所以塞 5 到 temp[1] .( while l <= mid
5 的 count+= rightCount, 也就是 count[0] += 1
接著是 merge 1, and merge 2,5

ex 2 .5 merge 1 時 =>
lowPtr . | hiPtr
2 . 5 . 1
=> 經歷之前第一個 while 後 => 1 2 5 .=> rightCount = 1
lowPtr . mid hiPtr
2 . 5 . 1
while (l <= mid ) .=> 所以 2, 5 (count[1], count[0])都要 += rightCount (因為有個小的1 到左邊啦


最後把 temp 結果(sort 的), 更新到原本 items 中
Last updated
Was this helpful?