We have some permutation A
of [0, 1, ..., N - 1]
, where N
is the length of A
.
The number of (global) inversions is the number of i < j
with 0 <= i < j < N
and A[i] > A[j]
.
The number of local inversions is the number of i
with 0 <= i < N
and A[i] > A[i+1]
.
Return true
if and only if the number of global inversions is equal to the number of local inversions.
Example 1:
Input: A = [1,0,2] Output: true Explanation: There is 1 global inversion, and 1 local inversion.
Example 2:
Input: A = [1,2,0] Output: false Explanation: There are 2 global inversions, and 1 local inversion.
Note:
A
will be a permutation of[0, 1, ..., A.length - 1]
.A
will have length in range[1, 5000]
.- The time limit for this problem has been reduced.
思路:这个题目brute force很好想,就是count,再比较。但是注意到题目只要返回true or false,所以只要遇见不满足的情况就可以直接返回false了。那么什么情况下会返回false呢?
local inversion <= global inversion, 什么情况下 local < global 呢?就是 i < j && a[i] > a[j] ,只要除掉i, i+1比较。
那么换句话说,对于每个i,就可以判断 [0 ~ i-2] 有没有大于a[i] 的即可,如果有,则有inversion, time complexity: O(N)
class Solution {
public boolean isIdealPermutation(int[] A) {
if(A == null || A.length == 0) return true;
int max = -1;
for(int i=0; i<A.length-2; i++){
max = Math.max(max, A[i]);
if(max > A[i+2]){
return false;
}
}
return true;
}
}