等差数列求和
class Solution {
public:
vector<int> distributeCandies(int candies, int num_people) {
int n = num_people;
// how many people received complete gifts
int p = (int)(sqrt(2 * candies + 0.25) - 0.5);
int remaining = (int)(candies - (p + 1) * p * 0.5);
int rows = p / n, cols = p % n;
vector<int> d(n, 0);
for (int i = 0; i < n; ++i) {
// complete rows
d[i] = (i + 1) * rows + (int)(rows * (rows - 1) * 0.5) * n;
// cols in the last row
if (i < cols) d[i] += i + 1 + rows * n;
}
// remaining candies
d[cols] += remaining;
return d;
}
};
主要利用一个特性:子节点除以二取下限就是父节点的标号,但是这里因为做了一个之字形的修改,所以对偶数行需要处理,取反即可
class Solution {
public:
int getReverse(int label, int row) {
return (1 << row - 1) + (1 << row) - 1 - label;
}
vector<int> pathInZigZagTree(int label) {
int row = 1, rowStart = 1;
while (rowStart * 2 <= label) {
row++;
rowStart *= 2;
}
if (row % 2 == 0) {
label = getReverse(label, row);
}
vector<int> path;
while (row > 0) {
if (row % 2 == 0) {
path.push_back(getReverse(label, row));
} else {
path.push_back(label);
}
row--;
label >>= 1;
}
reverse(path.begin(), path.end());
return path;
}
};
动态规划:对每本书都尝试能否将后面的书放在同一排
class Solution {
public:
int minHeightShelves(vector<vector<int>>& books, int shelf_width) {
vector<int> dp(books.size() + 1, INT_MAX);
dp[books.size()] = 0;
for (int i = books.size() - 1; i >= 0; --i) {
int max_book_height = 0;
int left_width = shelf_width;
// 把第 j 本书拿到第 i 本书后面
for (int j = i; j < books.size() && left_width >= books[j][0]; ++j) {
max_book_height = max(max_book_height, books[j][1]);
dp[i] = min(dp[i], max_book_height + dp[j+1]);
left_width -= books[j][0];
}
}
return dp[0];
}
};
class Solution {
public:
bool parseBoolExpr(string expression) {
if(expression == "f") return false;
if(expression == "t") return true;
if(expression[0] == '!'){
expression.pop_back();
return !parseBoolExpr(expression.substr(2));
}
int i = 0; while(expression[i] != '(') i++;
int j = expression.size() - 1; while(expression[j] != ')') j--;
string ev;
int cnt = 0;
if(expression[0] == '&'){
for(int k = i + 1; k < j; ++k){
if(expression[k] == '(') cnt++;
else if(expression[k] == ')') cnt--;
if(expression[k] == ','){
if(cnt != 0) ev += expression[k];
else {
if(!parseBoolExpr(ev)) return false;
ev.clear();
}
}
else ev += expression[k];
}
if(!parseBoolExpr(ev)) return false;
return true;
}
else if(expression[0] == '|'){
for(int k = i + 1; k < j; ++k){
if(expression[k] == '(') cnt++;
else if(expression[k] == ')') cnt--;
if(expression[k] == ','){
if(cnt != 0) ev += expression[k];
else {
if(parseBoolExpr(ev)) return true;
ev.clear();
}
}
else ev += expression[k];
}
if(parseBoolExpr(ev)) return true;
return false;
}
// impossible
return false;
}
};
将字符串address 中‘.’ 替换为"[.]" 即可
class Solution {
public:
string defangIPaddr(string address) {
string ans;
for (auto & c : address) {
if (c == '.') {
ans.append("[.]");
} else {
ans.push_back(c);
}
}
return ans;
}
};
类似于公交车下车及加油问题,对起始位置++,最终位置–,然后最后累加即可。
class Solution {
public:
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> nums(n);
for (auto& booking : bookings) {
nums[booking[0] - 1] += booking[2];
if (booking[1] < n) {
nums[booking[1]] -= booking[2];
}
}
for (int i = 1; i < n; i++) {
nums[i] += nums[i - 1];
}
return nums;
}
};
很容易想到用递归解题,关键是判断好递归的条件:如果找到set中的删除点,则至空、加入返回集并且访问左右子树,如果是叶子节点删除,则仅删除
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<TreeNode*> forest;
unordered_set<int> delete_set;
TreeNode* delHelper(TreeNode* root, TreeNode* parent) {
if(!root) return nullptr;
root->left = delHelper(root->left, root);
root->right = delHelper(root->right, root);
//情况一
if(delete_set.find(root->val) != delete_set.end()) {
if(root->left) forest.push_back(root->left);
if(root->right) forest.push_back(root->right);
root = nullptr;
}
//情况二
else if(!parent) forest.push_back(root);
return root;
}
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
for(auto val : to_delete) delete_set.insert(val);
delHelper(root, nullptr);
return forest;
}
};