1.合并区间
代码:
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if(intervals.size() == 0) return result;
sort(intervals.begin(),intervals.end(),cmp);
result.push_back(intervals[0]);
for(int i = 1; i < intervals.size(); i++){
if(result.back()[1] >= intervals[i][0]){ // 重叠区间
result.back()[1] = max(intervals[i][1],result.back()[1]);
}else{
result.push_back(intervals[i]);
}
}
return result;
}
};
note:这道题和之前的重叠区间的判断一样的逻辑。(都要先排序哦)
只不过我们这次直接用新数组里的最新元素去和当前遍历元素去比,如果两种重叠,就去更新数组内的元素的右边界为两者的最大值。
2.单调递增的数字
代码:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int flat = strNum.size();
for(int i = strNum.size() - 1; i > 0; i--){
if(strNum[i] < strNum[i - 1]){
flat = i;
strNum[i - 1]--;
}
}
for(int i = flat; i < strNum.size(); i++){
strNum[i] = '9';
}
return stoi(strNum);
}
};
note:判断哪些位置为9,需要我们从后往前遍历!因为如果从前往后遍历,在遍历中修改值的时候会导致后面的元素又比前面元素小了,出现不满足单调递增的情况。
此外,int变string是to_string() string变int是stoi()
3.监控二叉树
代码:
/**
* 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 {
// 0 无覆盖 1 有摄像头 2 有覆盖
private:
int result;
int traversal(TreeNode* node){
if(node == NULL) return 2;
// 左
int left = traversal(node->left);
// 右
int right = traversal(node->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; // 函数不会走到这里的
}
public:
int minCameraCover(TreeNode* root) {
result = 0;
if(traversal(root) == 0){
result++;
}
return result;
}
};
note:注意遇到空结点返回已覆盖的状态,为了让叶子节点的parent节点成功安装摄像头。
以及在中间的逻辑判断的时候,点判断要安装摄像头的情况,再判断已覆盖的情况。因为这两者所用的条件判断是有子集的,如果左节点有摄像头,右节点没有,那么为了覆盖所有的节点,parent节点应该放摄像头而不是已覆盖的状态。
以及要单独对根结点进行判断,因为根结点没有父节点安装摄像头来处理了,所以如果根结点没有覆盖到,要单独安装。