题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1.思路
思路1: 插入排序 —- 时间O(n²),空间O(1)
双重循环,遇到偶数在前奇数在后的相邻两个元素就马上进行交换;
这样能保证交换后奇数与奇数之间、偶数与偶数之间相对前后位置不变,即保证排序的稳定性。
思路2: 牺牲空间换时间 —- 时间O(n),空间O(n)
新建两个数组,分别用来存放原数组中的奇数、偶数;
然后再将这两个数组的元素重新赋值给原数组,即筛选–分类–覆盖。
从原数组中筛选奇、偶数;分类到奇数数组和偶数数组中分别存放;依次将奇数数组元素、偶数数组元素重新写回原数组去覆盖原数组的值。
2.代码(Java实现)
// 思路1.插入排序排序
class Solution {
public void reOrderArray(int [] array) {
// 1.插入排序排序
for(int i = 0;i < array.length - 1; i ++){
for(int j = 0; j < array.length-1-i; j ++){
if(array[j] % 2 == 0 && array[j + 1] % 2 != 0){
int t = array[j];
array[j] = array[j + 1];
array[j + 1] = t;
}
}
}
}
}
class Solution {
public void reOrderArray(int [] array) {
// 思路2. 空间换时间
int len1 = 0,len2 = 0;
for (int i = 0; i < array.length ; i ++){
if (array[i] % 2 != 0){
len1 ++;
}
if (array[i] % 2 == 0){
len2 ++;
}
}
int []odd = new int[len1];
int []even = new int[len2];
int j = 0,k = 0;
for (int i = 0; i < array.length ; i ++){
if (array[i] % 2 != 0){
odd[j++] = array[i];
}
if (array[i] % 2 == 0){
even[k++] = array[i];
}
}
for (int i = 0; i < len1; i ++){
array[i] = odd[i] ;
}
for (int i = 0; i < len2; i ++){
array[len1 + i] = even[i] ;
}
}
}
开始解题的时候没有考虑到保证稳定性,使用了类似于简单选择排序的方法,如果不要求稳定性,那么这个方法还是不错的。时间复杂度O(n),空间复杂度O(1)
思路:
(1)前后各设一个游标,前为i,后为j;
(2)当array[i]是奇数,i后移,当array[j]是偶数,j前移,当array[i]是偶数 且array[j]是奇数,两者互换;
(3)i <= j为限定条件。
代码
public class Solution {
public void reOrderArray(int [] array) {
for (int i = 0, j = array.length - 1; i <= j ; i ++, j --) {
if(array[i] % 2 != 0) {
i ++;
}
if(array[j] % 2 == 0) {
j --;
}
if (array[i] % 2 == 0 && array[j] % 2 != 0) {
int temp = array[i];
array[i] = array[j];
array[j] = array[i];
}
}
}
}
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/7110c12.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/7110c12.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。