题目描述:
给你一个长度为 n 的整数数组 nums ,表示由范围 [0, n - 1] 内所有整数组成的一个排列。
全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目:
0 <= i < j < n
nums[i] > nums[j]
局部倒置 的数目等于满足下述条件的下标 i 的数目:
0 <= i < n - 1
nums[i] > nums[i + 1]
当数组 nums 中 全局倒置 的数量等于 局部倒置 的数量时,返回 true ;否则,返回 false 。
解题思路:
1.维护前缀最大值
根据题意,我们可以发现,一个数组中的局部倒置一定是全局倒置,但是全局倒置不一定是局部倒置。也就是说,全局倒置的数量一定大于等于局部倒置的数量。
因此,我们枚举每个数 nums[i],其中 2≤i≤n−1,维护前缀数组 nums[0,…i−2] 中的最大值,记为 mx。如果存在 mx 大于 nums[i],说明全局倒置的数量大于局部倒置的数量,返回 false 即可。
遍历结束后,返回 true。
代码演示:
class Solution:
def isIdealPermutation(self, nums: List[int]) -> bool:
a = 0
for i in range(2, len(nums)):
if (a := max(a, nums[i - 2])) > nums[i]:
return False
return True