由于本笔记编辑时保存前误触,导致内容消失,所以为节省时间采取简单写法重写。
56. 合并区间
思路:
-
若结果为空 或当前区间和结果最后一个区间不重叠,则把当前区间加入结果
-
若当前区间和结果最后一个区间重叠,则更新最后一个区间的右边界为最大值;
cpp
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
for (const auto& interval : intervals) {
if (res.empty() || res.back()[1] < interval[0]) {
res.push_back(interval);
} else {
res.back()[1] = max(res.back()[1], interval[1]);
}
}
return res;
}
};
738. 单调递增的数字
思路:
从后往前找到处在最前面位置的不递增的数字;
把该数字后面的数全置为9
cpp
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string str = to_string(n);
int flag=str.size();
for(int i=str.size()-1;i>0;i--){
if(str[i-1]>str[i]){
flag = i;
str[i-1]--;
}
}
for(int i=flag;i<str.size();i++){
str[i]='9';
}
return stoi(str);
}
};
968. 监控二叉树
思路:
想到应该根据左右孩子的状态决定父节点的处理逻辑,所以用后序遍历(左右中)
三种节点状态:不被监控-0、装摄像头-1、被监控-2
三种处理逻辑:
1.左右孩子均为2,父节点为0(只需要在父节点的父节点装摄像头,否则就重复监控了)
2.左右孩子有一个为0,父节点为1(否则为0的子节点会被忽略)
3.左右孩子有一个为1,父节点为2
注:如果最后整棵树的父节点状态如果为0,将其置为1,否则会出现父节点本身没被监控的情况
cpp
class Solution {
public:
int result=0;
int travseral(TreeNode* cur){
if (cur==NULL) return 2;
int left = travseral(cur->left);
int right = travseral(cur->right);
if(left==2 && right==2) return 0;
if(left==0 || right==0){
result++;
return 1;
}
if(left==1 || right==1) return 2;
return -1;
}
int minCameraCover(TreeNode* root) {
result=0;
if(travseral(root) == 0) result++;
return result;
}
};