全局倒置与局部倒置
难度:
标签:
题目描述
代码结果
运行时间: 42 ms, 内存: 26.0 MB
/*
* 使用 Java Stream 进行实现。
* 思路:
* 我们需要检查是否存在 nums[i] > nums[j] 且 j > i + 1 的情况。
* 如果存在则返回 false,否则返回 true。
*/
import java.util.stream.IntStream;
public boolean isIdealPermutation(int[] nums) {
return IntStream.range(0, nums.length - 2)
.allMatch(i -> nums[i] <= nums[i + 2]);
}
解释
方法:
这个题解的核心思路基于局部倒置一定是全局倒置的特性。如果要使全局倒置的数量等于局部倒置的数量,那么不能存在非局部的全局倒置(即跨越超过一个元素的倒置)。此题解通过检查每个元素的索引和值之间的差的绝对值是否大于1来判断是否存在非局部的全局倒置。如果所有元素的值与其索引位置差的绝对值都不大于1,则表明所有的全局倒置都是局部倒置,返回True;否则,存在非局部的全局倒置,返回False。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
请解释为什么局部倒置一定是全局倒置的特例?
▷🦆
在给定的算法中,为什么只需要检查每个元素的索引和值之间差的绝对值是否大于1就足以判断是否有非局部倒置?
▷🦆
这种方法是否考虑了所有可能的全局倒置情况,还是仅仅针对特定类型的全局倒置进行检测?
▷