題目連結:
題目意譯:
你被給定一個整數陣列 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]。如果有則代表全域倒置的數量絕對不等於局部倒置的數量,因此回傳假。
而如果掃完所有數字後都沒發現如上的情形,則代表沒有其他的全域倒置了,因此全域倒置的數量等於局部倒置的數量。因此回傳真。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。