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单调数列和按奇偶数组排序的主要内容,如果未能解决你的问题,请参考以下文章