814. 二叉树剪枝
代码实现(自解)
类似DFS,自底向上地解决问题
/**
* 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:
TreeNode* pruneTree(TreeNode* root) {
if (!root) return NULL;
root->left = pruneTree(root->left);
root->right = pruneTree(root->right);
if (!root->left && !root->right && !root->val) root = NULL;
return root;
}
};
1508. 子数组和排序后的区间和
代码实现(自解)
利用最小堆求解
class Solution {
public:
int rangeSum(vector<int>& nums, int n, int left, int right) {
priority_queue<int, vector<int>, greater<int>> pq;
for (const auto num : nums) {
pq.push(num);
}
int sum;
for (int i = 0; i < nums.size(); i++) {
sum = nums[i];
for (int j = i + 1; j < nums.size(); j++) {
sum += nums[j];
pq.push(sum);
}
}
for (int i = 1; i < left; i++) {
pq.pop();
}
long long ans = 0;
for (int i = 1; i <= right - left + 1; i++) {
ans += pq.top();
pq.pop();
}
return ans % 1000000007;
}
};
1574. 删除最短的子数组使剩余数组有序
代码实现(部分看题解)
找到左边和右边的有序数组,那么中间剩下的,肯定不有序,是肯定要删除的,然后对每个左边的有序数组中的数,二分查找它在右边的位置,已保证二者合起来之后还是有序的
class Solution {
public:
int findLengthOfShortestSubarray(vector<int>& arr) {
int n = arr.size();
int l = 0, r = n - 1;
while (l < n - 1 && arr[l] <= arr[l + 1]) l++;
while (r >= 1 && arr[r - 1] <= arr[r]) r--;
if (r == 0) return 0;
int ans = r;
for (int i = 0; i <= l; i++) {
int bound = lower_bound(arr.begin() + r, arr.end(), arr[i]) -
arr.begin();
ans = min(ans, bound - 1 - i);
}
return ans;
}
};