LeetCode210514单调数列和按奇偶数组排序

Posted 程序彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode210514单调数列和按奇偶数组排序相关的知识,希望对你有一定的参考价值。

单调数列

思路:
定义一个标志位布尔值,他只可能是true或false,单调也只有两种情况,递增或递减,故return返回递增true的情况和递减false的情况。判断是否有序即可,如果true,递增情况,当前数小于下一个数才递增,如果当前数大于下一个数,则返回false。else中逻辑同上。最终遍历到数组末尾则一直符合条件才会遍历到最后,故返回true。

	public static boolean isDandiao(int[] arr){
        return isSort(arr,true)||isSort(arr,false);
    }
	public static boolean isSort(int[] arr,boolean flag){
        int n = arr.length;
        if(flag){
            for (int i = 0; i < n-1; i++) {
                if (arr[i]>arr[i+1]){
                    return false;
                }
            }
        }else {
            for (int i = 0; i < n - 1; i++) {
                if (arr[i]<arr[i+1]){
                    return false;
                }
            }
        }
        return true;
    }	

按奇偶数组排序

思路:
法一:使用快排补充条件对进行奇偶排序。首先复制出一个数组,将原数组中的值赋值给复制数组。再对复制数组进行快速排序,指定(a,b)->Integer.compare(a%2,b%2)。
最后再遍历原数组,将复制数组中的值重新赋值给原数组上。
法二:维护一个全局变量index索引,复制出一个空数组,从原数组中进行两次for循环遍历先找出偶数,再找出奇数,分别放到赋值数组中,最终返回复制数组即可。
法三:首尾指针法,定义一个头指针一个尾指针,在while头指针小于尾指针位置的条件下,如果头指针所指值对2取模小于尾指针所指值对2取模,则交换两数位置。如果头指针所指值对2取模为1,则代表当前数是必须换到后面的数,故只去前移尾指针。如果头指针所指值对2取模为0,故当前数就是偶数不用交换,前指针后移,继续判断即可。

	public static int[] sortJiOu(int[] arr){
        Integer[] copyArr = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++) {
            copyArr[i] = arr[i];
        }

        Arrays.sort(copyArr,(a,b)->Integer.compare(a%2,b%2));

        for (int i = 0; i < arr.length; i++) {
            arr[i]= copyArr[i];
        }
        return arr;
    }

    public static int[] method2(int[] arr){
        int index = 0;
        int n = arr.length;
        int[] copyArr = new int[n];
        for (int i = 0; i < n; i++) {
            if (arr[i]%2==0){
                copyArr[index] = arr[i];
                index++;
            }
        }
        for (int i = 0; i < n; i++) {
            if (arr[i] % 2 == 1) {
                copyArr[index] = arr[i];
                index++;
            }
        }
        return copyArr;
    }

    public static int[] method3(int[] arr){
        int n = arr.length;
        int i = 0;
        int j = n-1;

        while (i < j) {
            if (arr[i] % 2 > arr[j] % 2) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            if (arr[i] % 2 == 1) {
                j--;
            }
            if (arr[i] % 2 == 0) {
                i++;
            }
        }
        return arr;
    }

以上是关于LeetCode210514单调数列和按奇偶数组排序的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 记录

奇偶排序Odd-even sort

896. 单调数列『简单』

leetcode 328 奇偶链表

LeetCode刷题896-简单-单调数列

1745. 单调数列