ETH官方钱包

前往
大廳
主題

LeetCode - 2659. Make Array Empty 解題心得

Not In My Back Yard | 2024-06-30 12:00:05 | 巴幣 0 | 人氣 57

題目連結(jié):


題目意譯:
你被給定一個包含著相異整數(shù)的整數(shù)陣列 nums,而你可以執(zhí)行以下操作直到陣列為空:
    如果第一個元素有著最小值,將其移除;
    反之,將第一個元素放至於陣列尾端。

回傳一個整數(shù)來代表著讓 nums 變?yōu)榭贞嚵械乃璨僮鲾?shù)。

限制:
1 ≦ nums.length ≦ 10 ^ 5
-10 ^ 9 ≦ nums[i] ≦ 10 ^ 9
nums 中所有數(shù)字彼此相異。



範例測資:
範例 1:
輸入: nums = [3,4,-1]
輸出: 5
操作        陣列
1           [4, -1, 3]
2           [-1, 3, 4]
3           [3, 4]
4           [4]
5           []

範例 2:
輸入: nums = [1,2,4,3]
輸出: 5
操作        陣列
1           [2, 4, 3]
2           [4, 3]
3           [3, 4]
4           [4]
5           []

範例 3:
輸入: nums = [1,2,3]
輸出: 3
操作        陣列
1           [2, 3]
2           [3]
3           []


解題思維:
(令 n = nums.length)
假設(shè)現(xiàn)在陣列的開頭元素是 nums[i],則可以根據(jù)題目定義的操作得到現(xiàn)在陣列的樣子會是 [nums[i], nums[i + 1], ……, nums[n - 1], nums[0], nums[1], ……]。當然,要扣掉那些已經(jīng)被移除的元素。

假設(shè)現(xiàn)在陣列開頭是 nums[i] 且當前剩餘元素中最小的是 nums[j]。如果 i == j,則相安無事,移除 nums[i] 即可(實作時,不會真的移除 nums[i],只會「標記」)。

如果 i < j,則代表著我們需要將 nums[i] 、 nums[i + 1] 、 …… 、 nums[j - 1] 依序移到陣列結(jié)尾,當然依舊需要扣掉那些已經(jīng)被移除的元素們。因此操作數(shù)將會是 (j - i) - (nums[i] ~ nums[j - 1] 中的已移除元素個數(shù))。

如果 i > j,則類似 i < j 的時候,我們需要將 nums[i] 、 nums[i + 1] 、 …… 、 nums[n - 1] 以及 nums[0] 、 nums[1] 、 …… 、 nums[j - 1] 依序移到陣列結(jié)尾。因此操作數(shù)將會是 (n - i + j) - (nums[i] ~ nums[n - 1] 中的已移除元素個數(shù)) - (nums[0] ~ nums[j - 1] 中的已移除元素個數(shù))。



此時如果我們把「未移除」的元素當作 0、「已移除」的元素當作 1,則求如 (nums[x] ~ nums[y] 的已移除元素個數(shù)) 即是在求 nums[x] ~ nums[y] 這段子陣列的數(shù)值總和。

而可以看到這部份可以用線段樹(Segment Tree)來維護,參見這題

至於取得「下一個」最小值的位置,可以直接用優(yōu)先佇列(Priority Queue)便可以做到。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作