【代码随想录】刷题笔记Day39
2023-12-26 17:37:06
前言
- 下午答疑课过于无聊了,后台在跑代码也写不了作业,再刷点题吧~难得一天两篇
56. 合并区间 - 力扣(LeetCode)
- 和之前重叠区间是同个类型,和res里的元素比较,重叠就更新res里最后元素的最右边界
-
class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<vector<int>> result; if (intervals.size() == 0) return result; // 区间集合为空直接返回 // 排序的参数使用了lambda表达式 sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];}); // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并 result.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) { if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间 // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的 result.back()[1] = max(result.back()[1], intervals[i][1]); } else { result.push_back(intervals[i]); // 区间不重叠 } } return result; } };
?738. 单调递增的数字 - 力扣(LeetCode)
- 暴力超时,从后往前遍历,如果前大于后,前-1,后全变9
-
class Solution { public: //从后往前遍历,如果前面的字符较大,则减1,后面的会更新成9 int monotoneIncreasingDigits(int n) { string s = to_string(n); int len = s.size(); int index = len; //哪个地方往后需要全变成9 //初始化为len,因为如果像1234这样不需要更改的,index应从尾部+1开始变9 for (int i = len - 1; i > 0; i--) { if (s[i - 1] > s[i]) { s[i - 1]--; index = i; // 这里不直接将s[i]变为9,是因为当两相邻数相等时, // 不会满足修改条件,最终结果不符合要求 , // 如1000,后两位相等,最后结果会变成900,明显应该是999才对 } } for (int i = index ; i < len ;i++) s[i] = '9'; //最后转为数字 return stoi(s); } };
?968. 监控二叉树 - 力扣(LeetCode)
- 综合回溯(二叉树递归后序遍历) + 贪心(从叶子节点想覆盖)+ 各种考虑情况,直接抄
-
// 版本一 class Solution { private: int result; int traversal(TreeNode* cur) { // 空节点,该节点有覆盖 if (cur == NULL) return 2; int left = traversal(cur->left); // 左 int right = traversal(cur->right); // 右 // 情况1 // 左右节点都有覆盖 if (left == 2 && right == 2) return 0; // 情况2 // left == 0 && right == 0 左右节点无覆盖 // left == 1 && right == 0 左节点有摄像头,右节点无覆盖 // left == 0 && right == 1 左节点有无覆盖,右节点摄像头 // left == 0 && right == 2 左节点无覆盖,右节点覆盖 // left == 2 && right == 0 左节点覆盖,右节点无覆盖 if (left == 0 || right == 0) { result++; return 1; } // 情况3 // left == 1 && right == 2 左节点有摄像头,右节点有覆盖 // left == 2 && right == 1 左节点有覆盖,右节点有摄像头 // left == 1 && right == 1 左右节点都有摄像头 // 其他情况前段代码均已覆盖 if (left == 1 || right == 1) return 2; // 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解 // 这个 return -1 逻辑不会走到这里。 return -1; } public: int minCameraCover(TreeNode* root) { result = 0; // 情况4 if (traversal(root) == 0) { // root 无覆盖 result++; } return result; } };
后言
- 正好5点结束!干饭去咯!去吃吃新修的怡膳堂怎么样!!?
文章来源:https://blog.csdn.net/qq_56077562/article/details/135224252
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!