小F的有序数组 | 豆包MarsCode AI刷题

99 阅读1分钟

思路: 根据题意“每次可以交换下标为 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;
    }
}