问题:
给定一个由【0~N-1】组成的一个排列数组。
local降序:相邻两个元素逆序。
global降序:任意两个元素逆序。
若该数组local降序数=global降序数,则返回true,
反之返回false。
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.
解法1:
该题即:所有元素只有相邻数逆序,则返回true
那么,若第 i 个数 < 他前面隔一位(index:0~i-2)的最大值max1,即非相邻逆序情况数,至少有一个(那个最大值)(也有可能多于1个)
这样的话,直接返回false即可。
参考代码:
1 class Solution { 2 public: 3 bool isIdealPermutation(vector<int>& A) { 4 int max1=0; 5 for(int i=1; i<A.size(); i++){ 6 if(A[i]<max1) return false; 7 max1=max(max1, A[i-1]); 8 } 9 return true; 10 } 11 };
解法2:
由于该数组的特殊性为【0~n-1】的排序,
若A[i]和他的index i 相差超过 1,那么有两种情况:
1. A[i]-i > 1 : 如[2, 1, 0], A[0]-i=2-0 > 1,那么至少有两个小于A[0]=2的数在第0位后面。那么对于A[0]来说,global=2>local=1
2. i-A[i] > 1 : 如[2, 1, 0], i-A[2]=2-0 > 1,那么至少有两个大于A[2]=0的数在第2位前面。那么对于A[2]来说,global=2>local=1
参考代码:
1 class Solution { 2 public: 3 bool isIdealPermutation(vector<int>& A) { 4 for(int i=0; i<A.size(); i++){ 5 if(abs(A[i]-i)>=2) return false; 6 } 7 return true; 8 } 9 };
775. Global and Local Inversions
原文:https://www.cnblogs.com/habibah-chang/p/12856999.html