调整数组顺序使奇数位于偶数前面(奇数和偶数相对位置不变)

题目描述

  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  思路:要保持奇数和偶数的相对位置不变并且达到O(n)的时间复杂度的话,必须要用O(n)的辅助空间。
 1 class Solution {
 2 public:
 3 void reverseArray(vector<int> &array, int begin)
 4 {
 5     int end=array.size()-1;
 6     while(begin<end)
 7     {
 8         int tmp=array[begin];
 9         array[begin]=array[end];
10         array[end]=tmp;
11         ++begin;
12         --end;
13     }
14 }
15 void reOrderArray(vector<int> &array)
16 {
17     if(array.size()<=1)return;
18     vector<int> tmp=array;
19     int left=0, right=array.size()-1;
20     for(int i=0; i<tmp.size(); ++i)
21     {
22         if(tmp[i] & 1)array[left++]=tmp[i];
23         else array[right--]=tmp[i];
24     }
25     reverseArray(array, right+1);//将偶数部分逆序
26 }
27 };

  不使用辅助空间的话,只能实现O(n^2)的时间复杂度。首先寻找第一个奇数,并将其放在0号位置。然后将第一个奇数之前的元素全部往后移一位。然后在第一个奇数之后的元素中寻找奇数,并做移动操作。就可以保证原来的相对顺序。

 1 class Solution {
 2 public:
 3 void reOrderArray(vector<int> &array)
 4 {
 5     if(array.size()<=1)return;
 6     for(int i=0; i<array.size(); ++i)
 7     {
 8         int j=i;
 9         while(!(array[j] & 1) && j<array.size())++j;
10         if(j==array.size())return;
11         int tmp=array[j];
12         while(j>i)
13         {
14             array[j]=array[j-1];
15             --j;
16         }
17         array[i]=tmp;
18     }
19 }
20 };

 

 

转载于:https://www.cnblogs.com/jeysin/p/8087701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值