前往
大廳
主題

LeetCode - 2104. Sum of Subarray Ranges 解題心得

Not In My Back Yard | 2023-10-18 12:00:22 | 巴幣 0 | 人氣 73

題目連結:


題目意譯:
你被給定一整數陣列 nums。一個 nums 之子陣列的範圍值為該子陣列中的最大值與最小值之差值。

回傳 nums 中所有子陣列範圍值之總和。

一子陣列為一陣列中的一連串非空元素序列。

限制:
1 ≦ nums.length ≦ 1000
-10 ^ 9 ≦ nums[i] ≦ 10 ^ 9

進階: 你可以撰寫出一個時間複雜度為 O(n) 的解法嗎?



範例測資:
範例 1:
輸入: nums = [1,2,3]
輸出: 4
解釋: nums 的 6 個子陣列為以下:
[1],範圍值 = 最大 - 最小 = 1 - 1 = 0
[2],範圍值 = 2 - 2 = 0
[3],範圍值 = 3 - 3 = 0
[1,2],範圍值 = 2 - 1 = 1
[2,3],範圍值 = 3 - 2 = 1
[1,2,3],範圍值 = 3 - 1 = 2
所以所有範圍值的總和為 0 + 0 + 0 + 1 + 1 + 2 = 4。

範例 2:
輸入: nums = [1,3,3]
輸出: 4
解釋: nums 的 6 個子陣列為以下:
[1],範圍值 = 最大 - 最小 = 1 - 1 = 0
[3],範圍值 = 3 - 3 = 0
[3],範圍值 = 3 - 3 = 0
[1,3],範圍值 = 3 - 1 = 2
[3,3],範圍值 = 3 - 3 = 0
[1,3,3],範圍值 = 3 - 1 = 2
所以所有範圍值的總和為 0 + 0 + 0 + 2 + 0 + 2 = 4。

範例 3:
輸入: nums = [4,-2,-3,4,1]
輸出: 59
解釋: nums 所有子陣列之範圍值的總和為 59。


解題思維:
繼承昨天的題目之精神,把每一個元素 nums[i] 作為最小值存在的子陣列數量求出來(假設有 x 個),而作為最大值也是同理(假設有 y 個)。

然後把這些 (nums[i] × y - nums[i] × x) 之值全部加總即可得到所求。




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

創作回應

更多創作