荷蘭國旗問題:給定乙個陣列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 跨庫注入過程 第一步 獲取當前所有的...