0775. 全局倒置与局部倒置
大约 2 分钟
---
0775. 全局倒置与局部倒置
- 标签:数组、数学
- 难度:中等
题目链接
题目大意
描述:
给定一个长度为 的整数数组 ,表示由范围 内所有整数组成的一个排列。
「全局倒置」的数目等于满足下述条件不同下标对 的数目:
「局部倒置」的数目等于满足下述条件的下标 i 的数目:
要求:
当数组 中「全局倒置」的数量等于「局部倒置」的数量时,返回 true;否则,返回 false。
说明:
- 。
- 。
- 。
- 中的所有整数 互不相同。
- 是范围 内所有数字组成的一个排列。
示例:
- 示例 1:
输入:nums = [1,0,2]
输出:true
解释:有 1 个全局倒置,和 1 个局部倒置。- 示例 2:
输入:nums = [1,2,0]
输出:false
解释:有 2 个全局倒置,和 1 个局部倒置。解题思路
思路 1:数学规律
这道题的关键在于观察全局倒置和局部倒置的关系。
核心观察:
- 局部倒置是指相邻元素的倒置:。
- 全局倒置是指任意两个元素的倒置: 且 。
- 显然,所有局部倒置都是全局倒置。
- 要使全局倒置数量等于局部倒置数量,就要保证不存在非局部的全局倒置。
- 即:不存在 且 的情况。
等价条件:
- 对于每个位置 , 与其原本应该在的位置 的差距不能超过 。
- 即:。
解题步骤:
- 遍历数组,检查每个元素是否满足 。
- 如果所有元素都满足,返回
True。 - 否则返回
False。
思路 1:代码
class Solution:
def isIdealPermutation(self, nums: List[int]) -> bool:
# 检查每个元素是否与其索引的差距不超过 1
for i in range(len(nums)):
if abs(nums[i] - i) > 1:
return False
return True思路 1:复杂度分析
- 时间复杂度:,其中 是数组 的长度。需要遍历数组一次。
- 空间复杂度:。只使用了常数个额外变量。