前往
大廳
主題

LeetCode - 2012. Sum of Beauty in the Array 解題心得

Not In My Back Yard | 2022-03-06 00:00:04 | 巴幣 0 | 人氣 166

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums。對於每個索引值 i(1 ≦ i ≦ nums.length - 2),nums[i] 的美麗度等於:
2,如果 nums[j] < nums[i] < nums[k],對於所有 0 ≦ j < i 以及對於所有 i < k ≦ nums.length - 1。
1,如果 nums[i - 1] < nums[i] < nums[i + 1],且前一個情況不滿足。
0,如果上述情況皆不滿足。

回傳所有 nums[i] 的美麗度之總和,其中 1 ≦ i ≦ nums.length - 2。

限制:
3 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums = [1,2,3]
輸出: 2
解釋: 對於所有索引值 1 ≦ i ≦ 1:
- nums[1] 的美麗度等於 2。

範例 2:
輸入: nums = [2,4,6,4]
輸出: 1
解釋: 對於所有索引值 1 ≦ i ≦ 2:
- nums[1] 的美麗度等於 1。
- nums[2] 的美麗度等於 0。

範例 3:
輸入: nums = [3,2,1]
輸出: 0
解釋: 對於所有索引值 1 ≦ i ≦ 1:
- nums[1] 的美麗度等於 0。


解題思維:
定義一變數 S 來統計美麗度之總和,初始值為 0。

為了檢查每個索引值對於第一個情況有沒有符合,我們可以從左至右(索引值小到大)掃過一次 nums 陣列,再由右至左掃過一次。

當左到右的時候,檢查前面的數字(即 nums[0] ~ nums[i - 1])中的最大值是否小於 nums[i]。如果是則 nums[i] 完成了前半的條件,即 nums[j] < nums[i] 對於所有 0 ≦ j < i。而判斷條件中的最大值很好維護,這就是為什麼要由左至右。

同樣地,右到左的時候,檢查 nums[i] 是否小於後面的數字中的最小值。如果是則 nums[i] 完成了後半的條件,即 nums[i] < nums[k],對於所有 i < k ≦ nums.length - 1。

因此我們便可以知道每個位置 i 是否符合第一個情況,符合的話 S 就加上 2;反之,檢查索引值 i 是否符合第二個情況(因為這個情況比較簡單,所以可以直接檢查)。是的話就將 S 加 1。

最後 S 之值即為所求。




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

創作回應

更多創作