将一组数中的奇数和偶数分别储存在数组两侧。
1.建立另外两个数组,分别存储奇数和偶数,然后存储到原数组。空间复杂度O(3n) 时间复杂度O(2n).
2.双指针法设置头结点和尾节点,分别遍历偶奇数,不符合则交换位置,直到头结点位置大于等于尾节点。时间复杂度O(n),空间复杂度O(n)。
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
int arr[10001];
void seed()
{
srand(time(0));
for(int i=0; i<=100; i++)
{
arr[i]=rand()%15554;
}
}
void solve()
{
int i=0,j=100;
while(i<j)
{
while(arr[i]%2==0)
i++;
while(arr[j]%2)
j--;
if(i>=j)
break;
swap(arr[i],arr[j]);
}
//时间复杂度O(n)
}
int main()
{
seed();
solve();
for(int i=0; i<=100; i++)
cout << arr[i]<<' ';
return 0;
}
本来以为是一个简单的题,没想到还有优化空间,双指针法我学过但是遇到题还真想不起来,以前都是一个模块一个训练,都清楚这是什么算法形成惯性思维,但是都放在一起,就傻眼了,感觉就是背了一些套路,但是就是不会用,惰性思维害死人啊。