左神演算法基礎class2 例子1荷蘭國旗問題

2021-10-01 09:39:12 字數 2407 閱讀 7399

荷蘭國旗問題:給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度o(1),時間複雜度o(n)

1.把陣列劃分為小於等於num的區域和大於num的區域。用變數x代表小於區域的位置。剛開始由於不存在小於等於的區域,則x = -1,表示指向陣列-1(不存在)。再設定變數cur作為遍歷的位置,剛開始cur = 0指向陣列第乙個數。

2.開始遍歷

(1)如果cur<=num ,那麼把cur當前的元素和小於等於區域的下乙個數交換,即++x的位置和cur位置的數交換,cur,x後移;

(2)如果cur>num,cur後移;

(3)如果cur == arr_length結束遍歷。

eg [4,6,7,3],num = 5

1.cur 指向4,4<5,把4和x的下一位即0號位置4(自己和自己)交換。之後x指向4,cur++,cur指向6;

2.cur指向6,5<6,x不變,cur++;

3.cur指向7,5<7,x不變,cur++;

4.cur指向3,3<5,交換,x的下一位即6和3交換。之後x指向3,cur++,退出迴圈。

此時,x指向的3以及之前的4為小於等於區域,而x之後的7,6為大於區域。

·····圖發不出去。。。

while

(cur < arr_length)

else

}

#include

#include

#define arr_length 10

using

namespace std;

//交換函式

void

swap

(int

&a,int

&b)int

main()

cout

while

(cur < arr_length)

else

}//輸出交換後的arr1,arr2

cout<<

"arr1 = "

;for

(int i =

0;i<=x;i++

) cout

"arr2 = "

;for

(int i = x+

1;i) cout

("pause");

return0;

}

和預備問題相似

1.把陣列劃分為小於num的區域、等於num的區域和大於num的區域。用變數x代表小於區域的位置、y代表大於num的區域。剛開始由於不存在小於和大於的區域,則x = -1,y = length,表示指向陣列-1、length(不存在)。再設定變數cur作為遍歷的位置,剛開始cur = 0指向陣列第乙個數。

2.開始遍歷

(1)如果curnum,那麼把cur當前的元素和大於區域的前乙個數交換,即–y的位置和cur位置的數交換,y前移,cur不變(因為交換過來的數不確定)

(3)如果cur == num,cur++。

(4)如果cur == y結束。

while

(cur < y)

else

if(arr[cur]

== num)

else

}

#include

#include

#define arr_length 5

using

namespace std;

//交換函式

void

swap

(int

&a,int

&b)int

main()

cout

while

(cur < y)

else

if(arr[cur]

== num)

else

}//輸出交換後的arr1,arr2,arr3

cout<<

"arr1 = "

;for

(int i =

0;i<=x;i++

) cout

"arr2 = "

;for

(int i = x+

1;i) cout

"arr3 = "

;for

(int i = y;i) cout

("pause");

return0;

}

左神演算法 RandomPool

題目 設計一種結構,在該結構中有如下三個功能 insert key 將某個key加入到該結構,做到不重複加入。delete key 將原本在結構中的某個key移除。getrandom 等概率隨機返回結構中的任何乙個key。要求 insert delete和getrandom方法的時間複雜度都是 o ...

左神演算法基礎class8 題目5母牛產子問題

母牛每年生乙隻母牛,新出生的母牛成長三年後也能每年生乙隻母牛,假設不會死。求n年後,母牛的數量。先列出圖表找規律 可以看出規律 今年生的牛等於去年牛的總和,再加上所有成熟的牛再生乙個 成熟的母牛數量 那麼成熟的牛的數量怎麼知道呢?根據題意實際就是三年前牛的總和 三年前所有的牛完全能保證成熟可以生育,...

class2 跨庫注入

如果要應用跨庫注入,有乙個條件,那就是當前資料庫使用者必須為root使用者,才可以對整個資料庫進行操作 確定使用者 user 確定使用者 如果回顯為root localhost或者root 127.0.0.1只要 號前面為root,則代表該資料庫使用者為root 跨庫注入過程 第一步 獲取當前所有的...