Lecturer:Yeedrag
窩猜你們網課都沒有認真聽.w.
Vector
Queue
Stack
Pair/Tuple
priority_queue
(unordered)map
(unordered)set
每一次pq的最上面元素一定是裡面最大/小的!
預設/less<型態> top()為最大的
greater<型態> top()為最小的
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> pq1;
priority_queue<int,vector<int>,greater<int>> pq2;
priority_queue<long long int,vector<int>,less<long long int>> pq3;
}
pq1跟pq3都是最大的在上面(max heap)
pq2則是最小的在上面(min heap)
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> pq;
pq.push(3);
pq.push(5);
}
時間複雜度:\(O(logn)\) (因為是heap)
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> max_pq;
priority_queue<int,vector<int>,greater<int>> min_pq;
max_pq.push(3);
max_pq.push(5);
min_pq.push(3);
min_pq.push(5);
cout<<max_pq.top()<<endl;//5
cout<<min_pq.top()<<endl;//3
}
時間複雜度:\(O(1)\)
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> max_pq;
max_pq.push(3);
max_pq.push(5);
cout<<max_pq.top()<<endl;//5
max_pq.pop();//移除5
cout<<max_pq.top()<<endl;//3
}
時間複雜度:\(O(logn)\)
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> max_pq;
max_pq.push(3);
max_pq.push(5);
cout<<max_pq.size()<<endl;//2
max_pq.pop();
cout<<max_pq.size()<<endl;//1
}
時間複雜度:\(O(1)\)
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> max_pq;
max_pq.push(3);
if(max_pq.empty()){
cout<<"Empty!"<<endl;
} else {
cout<<"Not empty!"<<endl;
}
}//Not empty!
時間複雜度:\(O(1)\)
想一想(通靈一下),怎麼做才能讓加起來最小?
其實就是數學上的那種集合
每個元素並不會重複
也就是每個值唯一
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
}
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
s.insert(5);
}
時間複雜度:\(O(logn)\) (因為是紅黑樹)
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(3);
s.insert(5);
s.erase(5);//移除5
s.erase(s.begin());//移除第1項(3)
}
時間複雜度:\(O(logn)\) (如果值不存在不會發生任何事)
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
s.insert(5);
cout<<s.size()<<endl;//2
s.erase(3);
cout<<s.size()<<endl;//1
}
時間複雜度:\(O(1)\)
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
if(s.empty()){
cout<<"Empty!"<<endl;
} else {
cout<<"Not empty!"<<endl;
}
}//Not empty!
時間複雜度:\(O(1)\)
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
if(s.count(3)) {
cout << "exists\n";
}
else {
cout << "doesn't exists\n";
}//exists
}
時間複雜度:\(O(log n)\)
multiset<int> 像是set,但可以記錄數字有幾個
unordered_set<int> 沒有排序的set,不能
使用*s.begin()或*--s.end()之類的方法得到最大最小值,
但是\(O(1)\) (註:是可以被卡到\(O(n\))的!)
(很像是Python的dictionary)
#include<iostream>
#include<map>
using namespace std;
int main(){
map<int,int> m1;
map<string,int> m2;
map<char,string< m3;
}
1.insert一個pair
2.像是array一樣賦值
#include<iostream>
#include<map>
#include<utility>
using namespace std;
int main(){
map<string,int> m1;
m1.insert(pair<string,int>("yeedrag",1));
m1["yeedrag"] = 1;//兩個等同!
}
時間複雜度:\(O(logn)\) (因為是紅黑樹)
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,int> m1;
m1["yeedrag"] = 1;
cout<<m1["yeedrag"]<<endl;//1
m1["yeedrag"]++;
cout<<m1["yeedrag"]<<endl;//2
}
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,int> m1;
m1["yeedrag"] = 1;
cout<<m1["yeedrag"]<<endl;//1
m1.clear();
cout<<m1["yeedrag"]<<endl;//預設空的是0
}
時間複雜度:\(O(n)\)
給你\(n\)個數字,問可以去掉幾對數字還可以讓剩下數字的平均和原本一樣?
(可用map 或 multiset)
void bubble_sort(int arr[],int size){
for(int i=4;i>=1;i--){
for(int j=1;j<=i;j++){
if(arr[j]<arr[j-1]){//如果前面的比後面的大
swap(arr[j],arr[j-1]);//兩個交換
}
}
}
}
int main(){
int arr[5] = {1,5,3,4,2};
bubble_sort(arr,5);
for(int i=0;i<5;i++){
cout<<arr[i]<<" ";
} //1,2,3,4,5
}
void bogo_sort(int arr[],int size){
while(!is_sorted(arr,arr+size)){
random_shuffle(arr,arr+size);
}
}
sort(arr,arr+5,greater<int>()) 由大到小sort第0項到第4項
sort(arr+2,arr+4) sort第2項到第3項
sort(vec.begin(),vec.end()) 由大到小sort整個Vector
bool cmp(pair<int,int> a,pair<int,int> b){
//如果true 則 a 在前面,反之則 b 在前面
if(a.second==b.second){//如果第二項相同,比較第一項
return a.first<b.first;
} else {
return a.second<b.second;
}
}
int main(){
pair<int,int> arr[5] = {{1,3},{2,5},{7,1},{6,4},{17,3}};
sort(arr,arr+5,cmp);
for(int i=0;i<5;i++) cout<<arr[i].first<<" "<<arr[i].second<<endl;
}