题目链接
思路
第一想到的是把全局倒置和局部倒置都计算出来,然后比较是否相同。
局部倒置比较容易计算,全局倒置就是计算逆序对的个数,在归并排序的过程中计算即可。
代码如下:
#define MAX 100005
typedef long long ll;
class Solution
{
public:
int n;
int a[MAX], b[MAX];
ll local_num = 0, global_num = 0;
void merge_sort(int s, int e)
{
if(s == e)
{
return;
}
int mid = (s + e) / 2;
merge_sort(s, mid);
merge_sort(mid + 1, e);
int i = s, j = mid + 1, k = s;
while(i <= mid && j <= e)
{
if(a[i] <= a[j]) b[k++] = a[i++];
else
{
b[k++] = a[j++];
global_num += mid - i + 1;
}
}
while(i <= mid)
{
b[k] = a[i];
k++, i++;
}
while(j <= e)
{
b[k] = a[j];
k++, j++;
}
for(int i = s; i <= e; i++) //复制回a数组中
{
a[i] = b[i];
}
}
bool isIdealPermutation(vector<int>& nums)
{
for(int i = 0; i < nums.size(); i++)
{
a[i] = nums[i];
}
n = nums.size();
merge_sort(0, n - 1);
for(int i = 0; i < n - 1; i++)
{
if(nums[i] > nums[i + 1])
{
local_num++;
}
}
if(local_num == global_num)
{
return true;
}
return false;
}
};
官方题解
代码如下:
class Solution {
public:
bool isIdealPermutation(vector<int>& nums) {
int n = nums.size(), minSuff = nums[n - 1];
for (int i = n - 3; i >= 0; i--) {
if (nums[i] > minSuff) {
return false;
}
minSuff = min(minSuff, nums[i + 1]);
}
return true;
}
};