题目描述
Tag : 「树状数组」、「数学」
给你一个长度为 n
的整数数组 nums
,表示由范围
全局倒置 的数目等于满足下述条件不同下标对
局部倒置 的数目等于满足下述条件的下标 i 的数目:
当数组 nums
中 全局倒置 的数量等于 局部倒置 的数量时,返回 true
;否则,返回 false
。
示例 1:
示例 2:
提示:
-
nums
中的所有整数 互不相同 -
nums
是范围
树状数组
根据题意,对于每个
- 其左边比它大的 的个数,是以 为右端点的“全局倒置”数量,统计所有以 为右端点的“全局倒置”数量即是总的“全局倒置”数量
a
- 同时我们可以将每个 与前一个值进行比较,从而统计总的“局部倒置”数量
b
,其中 的取值范围为
一个容易想到的做法是利用「树状数组」,虽然该做法没有利用到核心条件「 是一个 的排列」,但根据数据范围 可知该复杂度为
代码:
- 时间复杂度:
- 空间复杂度:
数学
解法一中并没有利用到核心条件「 是一个
提示一:由“局部倒置”组成的集合为由“全局倒置”组成的集合的子集
任意一个“局部倒置”均满足“全局倒置”的定义,因此要判定两者数量是否相同,可转换为统计是否存在「不满足“局部倒置”定义的“全局倒置”」。
提示二:何为不满足“局部倒置”定义的“全局倒置”
结合题意,若存在坐标 和 ,满足 且 ,那么该倒置满足“全局倒置”定义,且不满足“局部倒置”定义。
若存在这样的逆序对,不满足,则有两类倒置数量不同。
提示三:考虑「如何构造」或「如何避免构造」不满足“全局倒置”定义的“局部倒置”
如果我们能够总结出「如何构造」或「如何避免构造」一个不满足“全局倒置”定义的“局部倒置” 所需的条件,问题可以转换为检查 nums
是否满足这样的条件,来得知 nums
是否存在不满足“全局倒置”定义的“局部倒置”。
我们可以结合「 是一个 的排列」来分析,若需要避免所有 的逆序对均不满足 ,只能是所有逆序对均由相邻数值产生。
代码:
- 时间复杂度:
- 空间复杂度: