给你一个长度为 n 的整数数组 nums ,表示由范围 [0, n - 1] 内所有整数组成的一个排列。
全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目:
0 <= i < j < n
nums[i] > nums[j]
局部倒置 的数目等于满足下述条件的下标 i 的数目:
0 <= i < n - 1
nums[i] > nums[i + 1]
当数组 nums 中 全局倒置 的数量等于 局部倒置 的数量时,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,0,2]
输出:true
解释:有 1 个全局倒置,和 1 个局部倒置。
n == nums.length
1 <= n <= 5000 中文翻译为5000 英文翻译为10^5 让我wa了无数次
0 <= nums[i] < n
nums 中的所有整数 互不相同
nums 是范围 [0, n - 1] 内所有数字组成的一个排列
class Solution {
public:
int tr[100010] = {0};
int n;
long long query(int x){
long long res = 0;
for(int i = x; i >= 1; i -= i & -i) res += tr[i];
return res;
}
void add(int x, int v){
for(int i = x; i <= n; i += i & -i) tr[i] += v;
}
bool isIdealPermutation(vector<int>& nums) {
// int n = nums.size();
// int min_ = nums[n - 1];
// for(int i = n - 3; i >= 0; i --){
// if(nums[i] > min_) return false;
// min_ = min(nums[i + 1], min_);
// }
// return true;
n = nums.size();
long long cnt1 = 0;
for(int i = 0; i < n; i ++){
cnt1 += query(n) - query(nums[i] + 1);
add(nums[i] + 1, 1);
}
int cnt2 = 0;
for(int i = 0; i + 1 < n; i ++){
cnt2 += nums[i] > nums[i + 1];
}
return cnt1 == cnt2;
}
};
可以滴