思路: 根据题意“每次可以交换下标为 i 和 (i + 2) % n 的两个元素”可知我们可以对数组索引是奇数的进行交换,可以对偶数的进行交换。如果n是偶数,那么奇数和偶数索引的元素只能在他们的分为内交换;如果n是奇数 (i + 2) % n这个操作可以实现奇数和偶数之间的交换,相对于整个arr都可以随便交换,这种情况是直接能将arr弄成非递减排列的,所以奇数情况直接返回true。n是偶数的情况就将他的奇数索引和偶数索引拿出来做排序,然后根据他们的位置判断他们的大小关系就行。
public class 小F的有序数组 {
public static boolean solution(int n, int[] arr) {
if(n%2==1){
return true;
}
int half=n/2;
int[] odd=new int[half];
int[] even=new int[half];
int i,j=0,k=0;
for(i=0;i<n;i++){
if(i%2==0){
even[j++]=arr[i];
}else{
odd[k++]=arr[i];
}
}
Arrays.sort(odd);
Arrays.sort(even);
for(i=0;i<half;i++){
if(odd[i]<even[i]){
return false;
}
if(i<half-1){
if(even[i+1]<odd[i]){
return false;
}
}
}
return true;
}
}