資料結構筆記

小白18651發表於2020-09-29

將一組數中的奇數和偶數分別儲存在陣列兩側。
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;
}

本來以為是一個簡單的題,沒想到還有優化空間,雙指標法我學過但是遇到題還真想不起來,以前都是一個模組一個訓練,都清楚這是什麼演算法形成慣性思維,但是都放在一起,就傻眼了,感覺就是背了一些套路,但是就是不會用,惰性思維害死人啊。

相關文章