题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
时间换空间的:
思想可以参考插入排序。时间复杂度为o(n^2),空间复杂度为o(1)
class Solution { public: void reOrderArray(vector<int> &array) { int i,j; int tmp; for(i=0;i<array.size();i++){ tmp=array[i]; j=i-1; if(array[i]%2==1){ while(j>=0&&array[j]%2==0){ array[j+1]=array[j]; j--; } array[j+1]=tmp; } } } };
类似的,也可以用快排思想解决这个问题。
空间换时间的:
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593 来源:牛客网 //第二个思路:再创建一个数组 class Solution{ public: void reOrderArray(vector<int> &array) { vector<int> array_temp; vector<int>::iterator ib1, ie1; ib1 = array.begin(); for (; ib1 != array.end();){ //遇见偶数,就保存到新数组,同时从原数组中删除 if (*ib1 % 2 == 0) { array_temp.push_back(*ib1); ib1 = array.erase(ib1); } else{ ib1++; } } vector<int>::iterator ib2, ie2; ib2 = array_temp.begin(); ie2 = array_temp.end(); for (; ib2 != ie2; ib2++) //将新数组的数添加到老数组 { array.push_back(*ib2); } } };
第二个思路的优化:
不用删除偶数,在数组中删除偶数带来额外的开销,记录偶数的位置,然后下一个基数直接覆盖过去就行!
原文地址:https://www.cnblogs.com/curo0119/p/9045253.html
时间: 2024-10-17 05:04:10