LeetCode刷题笔记 - 常用的CPP代码
这个文档整理了一些常用的CPP代码,例如如何确认unordered map中是否存在某一元素,如何定义一个min heap…
本文档默认遵循C++17标准。
Language
for loop
A typical for loop
for (int i = 0; i < arr.size(); i++) {
// ...
}
Iterator-based one (with auto type specifier in init-statement)
for (auto iter = arr.begin(); iter != arr.end(); ++iter) {
// ...
}
For loop with structured bindings in init-statement
for (const auto&[k, v] : freqs) {
// ...
}
STL
max的各种方法
/* Given a vector... */
vector<int> vec = {10, 20, 5, 30, 40, -50};
// max of vec
cout << *max_element(vec.begin(), vec.end()) << endl;
// max of vec[1: 4]
cout << *max_element(vec.begin()+1, vec.begin()+4) << endl;
// max of abs val, use of anonymous fn
int ans = *max_element(vec.begin(), vec.end(), [](int a, int b) {
return abs(a) < abs(b);
});
cout << ans << endl;
/* Given some elements... */
cout << max({10, 20, 30}) << endl;
How to sort a container
// more includes
#include <algorithm>
vector<int> vec = { -5, 3, 8, -1, 9 };
// Sort vec ascendingly by the absolute value of elements
sort(vec.begin(), vec.end(), [](int a, int b) {
return abs(a) < abs(b)
})
最大的int / unsigned int / …
#include <climits>
INT_MAX;
// or
numeric_limits<int>::max();
Vector常用操作
vector<int> arr(10, 0);
// access
arr[3];
arr.front();
arr.back();
// capacity
arr.empty();
arr.size();
arr.reserve(20);
arr.capacity();
// modifier
arr.insert(arr.begin() + 3, 20);
arr.emplace(arr.begin() + 3, 20);
arr.push_back(5);
arr.emplace_back(34);
arr.pop_back();
String to Number
#include <string>
// to integer
stoi("123");
// to long
stol("123");
// to unsigned long
stoul("123");
// to double
stof("1.234");
Misc
Define a 2d array using vector
vector<vector<int>>(numRows, vector<int>(numCols, 0));
Is element in set
template <typename T>
bool exists(T elem, unordered_set<T> &uset) {
return uset.find(elem) == uset.end();
}
Create a min heap (top is min element)
// priority_queue<T, Container, Compare>
// Compare(A, B) returns true if A < B.
// Since priority queue output the largest elements first,
// B is actually outputed before A
priority_queue<int, vector<int>, std::greater<int>> minHeap;
minHeap.push(40);
minHeap.push(20);
minHeap.push(30);
minHeap.push(10);
while (!minHeap.empty()) {
// 10, 20, 30, 40
cout << minHeap.top() << ", ";
minHeap.pop();
}
cout << endl;
Create a max heap with custom comparison function
struct Log {
char user;
int ts;
};
// Obtain K earliest logs from an unsorted vector of logs
vector<Log> earliestKLogs(vector<Log> logs, int k) {
auto logCmp = [](const Log& a, const Log& b) {
// if a has smaller timestamp than b, Compare(a, b) return true
// priority queue will output b before a
// b will be popped before a
return a.ts < b.ts;
};
priority_queue<Log, vector<Log>, decltype(logCmp)> maxHeap(logCmp);
for (const auto&log : logs) {
maxHeap.push(log);
if (maxHeap.size() > k) {
maxHeap.pop();
}
}
vector<Log> result;
result.reserve(k);
while (!maxHeap.empty()) {
result.push_back(maxHeap.top());
maxHeap.pop();
}
reverse(result.begin(), result.end());
return result;
}
void customCmpDemo() {
auto logs = vector<Log>{
Log{'A', 3},
Log{'B', 1},
Log{'C', 2},
Log{'D', 4},
Log{'E', 0},
};
auto result = earliestKLogs(logs, 3);
for (const auto& log : result) {
// E, 0
// B, 1
// C, 2
cout << log.user << ", " << log.ts << endl;
}
}
Common code snippet
遍历一格的上下左右格子
dRows = {-1, 0, 1, 0};
dCols = {0, -1, 0, 1};
// iterate through the up/left/down/right neighbors of (curRow, curCol)
for (int p = 0; p < 4; p++) {
process(curRow + dRows[p], curCol + dCols[p]);
}