前往
大廳
主題

LeetCode - 775. Global and Local Inversions 解題心得

Not In My Back Yard | 2021-05-25 00:00:05 | 巴幣 0 | 人氣 162

題目連結:


題目意譯:
你被給定一個整數陣列 nums,其長度為 n 並表示著 [0, n - 1] 這些整數的一個排列。

全域倒置的數量為 (i, j) 相異數對之數量,其中
0 ≦ i < j < n
nums[i] > nums[j]

局部倒置的數量為索引值 i 之數量,其中
0 ≦ i < n - 1
nums[i] > nums[i + 1]

回傳真(True)如果全域倒置的數量等於局部倒置的數量。

限制:
n == nums.length
1 ≦ n ≦ 10 ^ 5
0 ≦ nums[i] < n
nums 中的所有整數彼此相異。
nums 為 [0, n - 1] 這些整數的一個排列。



範例測資:
範例 1:
輸入: nums = [1,0,2]
輸出: true
解釋: 總共有 1 個全域倒置以及 1 個局部倒置。

範例 2:
輸入: nums = [1,2,0]
輸出: false
解釋: 總共有 2 個全域倒置以及 1 個局部倒置。


解題思維:
可以看到,局部倒置的數量一定會 ≦ 全域倒置的數量(因為根據定義,局部會被包含於全域中)。

所以我們只需要找到任何一個 (i, j) 數對滿足:
0 ≦ i < j < n 且 j - i ≧ 2
nums[i] > nums[j]

如果有一數 nums[j] 存有 nums[i] 滿足上述二式,則代表 nums[0] ~ nums[j - 2] 中的最大值(可能剛好是 nums[i],也可能另有其數)也會大於 nums[j]。

因此我們可以在得出 nums[0] ~ nums[j - 2] 中的最大值時,順便判斷該最大值是否大於 nums[j]。如果有則代表全域倒置的數量絕對不等於局部倒置的數量,因此回傳假。

而如果掃完所有數字後都沒發現如上的情形,則代表沒有其他的全域倒置了,因此全域倒置的數量等於局部倒置的數量。因此回傳真。




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

創作回應

更多創作