題目連結:
題目意譯:
你被給定一個索引值從 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 之值即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。