Java实现 LeetCode 775 全局倒置与局部倒置(分析题)
775. 全局倒置与局部倒置
数组 A 是 [0, 1, …, N - 1] 的一种排列,N 是数组 A 的长度。全局倒置指的是 i,j 满足 0 <= i < j < N 并且 A[i] > A[j] ,局部倒置指的是 i 满足 0 <= i < N 并且 A[i] > A[i+1] 。
当数组 A 中全局倒置的数量等于局部倒置的数量时,返回 true 。
示例 1:
输入: A = [1,0,2]
输出: true
解释: 有 1 个全局倒置,和 1 个局部倒置。
示例 2:
输入: A = [1,2,0]
输出: false
解释: 有 2 个全局倒置,和 1 个局部倒置。
注意:
A 是 [0, 1, …, A.length - 1] 的一种排列
A 的长度在 [1, 5000]之间
这个问题的时间限制已经减少了。
PS:
分析题
数组A中的元素是0到n-1
这个题的两种倒置,一种是差1的倒置,一种是差好几位的倒置
我们可以这么看,差1的倒置,只能一个,差好几位的倒置如果差的位置大于1
那么差好几位的倒置一定会比差1的倒置多的
所以这个题,就变成了,当前的位置如果比他的值差了2,那么就不相等了
class Solution {
public boolean isIdealPermutation(int[] A) {
int N = A.length;
int floor = N;
for (int i=N-1; i>=2; --i) {
floor = Math.min(floor, A[i]);
if (A[i-2] > floor) return false;
}
return true;
}
}