方法一:两次遍历
1.结题思路
简单题,两次遍历原始数组,分别将奇偶数按序加入结果数组
2.解法
遍历两次array数组,第一次遍历时,将所有奇数数组元素加入ans数组,第二次遍历时,将所有偶数数组元素加入ans数组
3.图解
4.具体代码
vector<int> reOrderArray(vector<int>& array) { vector<int>ans; for(auto it=array.begin();it!=array.end();it++){ if(*it&1)ans.push_back(*it); } for(auto it=array.begin();it!=array.end();it++){ if(*it%2==0)ans.push_back(*it); } return ans; }
5.时间复杂度和空间复杂度分析
时间复杂度:O(n),n是数组元素个数,仅遍历了两次数组。
空间复杂度:O(n),n是数组元素个数,用到了一维数组。
方法二:移动数组元素
1.结题思路
有点类似插入排序的思想,数组分成两部分,前半部分放我们已经处理好的调到前面来的奇数,后半部分放偶数,每次将奇数插入已排列好的奇数尾部。
2.解法
首先用一个变量pre保存已经移动到数组前部的奇数的下一个存放位置的下标,接着用变量temp临时保存一个这个奇数,并将前面所有的偶数后移一位,最后将temp所保存的奇数填入ans[pre],并更新pre++
3.图解
4.具体代码
/*vector<int> a; for(int i=0;i<10;i++) a[i]=i; 这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素;而现在的a[i]还是空的对象*/ vector<int> reOrderArray(vector<int>& array) { vector<int>ans(array);//用array来定义ans; int pre=0; for(int i=0;i<array.size();i++){ if(array[i]&1){ int temp=array[i]; for(int j=i;j>pre;j--){ ans[j]=ans[j-1]; } ans[pre++]=temp; } } return ans; }
5.时间复杂度和空间复杂度分析
时间复杂度:O(n^2),n是数组元素个数,类比插入排序,平均情况O(n^2)。
空间复杂度:O(n),n是数组元素个数。