问题
数组 是 的一种排列, 是数组 的长度。全局倒置指的是 满足 并且 ,局部倒置指的是 满足 并且 。
当数组 中全局倒置的数量等于局部倒置的数量时,返回 。
示例 1:
输入: 输出: 解释: 有 1 个全局倒置,和 1 个局部倒置。
示例 2:
输入: 输出: false 解释: 有 2 个全局倒置,和 1 个局部倒置。
注意:
- 是 的一种排列
- 的长度在 之间
- 这个问题的时间限制已经减少了。
解法
一开始想法比较简单,既然是求逆序对的数量,那么双层for循环一个的解法就完了。但是第三项注意事项中说了时间限制已经减少,所以毫无意外的超时了。 此时考虑逆序对的性质,全局倒置一定是局部倒置。 对一个的排序数组而言,索引,如果满足,那么,说明只是左移或者右移了一位(或者没变),全局倒置与局部倒置至少同时加一(或者保持不变),仍然满足条件;如果,那么,说明至少左移或者右移了两位,意味着右边至少有两个比自己小的数(或者左边必然有来2个比自己大且不相邻的数,其中至少一个不相邻)局部(必然<)全局所以造成一定不等,此时不满足条件,直接返回false。
代码
java
class Solution {
public boolean isIdealPermutation(int[] A) {
if (A.length <3) {
return true;
}
for (int i = 0; i < A.length; i++) {
if (Math.abs(A[i] - i) >= 2) {
return false;
}
}
return true;
}
}