赞
踩
class Solution { public: static bool cmp(vector<int>& a, vector<int>& b) { if(a[0] == b[0]) { return a[1] < b[1]; } return a[0] < b[0]; } vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), cmp); vector<vector<int>> res; int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < intervals.size(); i++) { if (intervals[i][0] >= start && intervals[i][0] <= end) { // 与前面的区间有重叠 if(intervals[i][1] >= end) { // 更新重叠区间的右端点 end = intervals[i][1]; } } else if (intervals[i][0] > end) { // 与前面的区间无重叠 res.push_back({start, end}); start = intervals[i][0]; end = intervals[i][1]; } } res.push_back({start, end}); return res; } };
738. 单调递增的数字
当发现当前数字大于下一个数字时,就把当前数字减1
,后面的所有数字都设置成 9
class Solution { public: int monotoneIncreasingDigits(int n) { if (n >= 0 && n <= 9) { return n; } string s = to_string(n); for (int i = s.size() - 2; i >= 0; i--) { if(s[i] > s[i + 1]) { s[i]--; for (int j = i + 1; j < s.size(); ++j){ s[j] = '9'; } } } return stoi(s); } };
第二个for
循环存在重复赋值;如:304537
,在检测到5<4
时,数字改为303999
;在遇到0<3
时,数字改为299999
,最后两位数同样被再次赋值;
设置flag
来标记赋值9
从哪里开始,同时将赋值循环分离出来;
class Solution { public: int monotoneIncreasingDigits(int n) { string s = to_string(n); int flag = s.size(); for (int i = s.size() - 2; i >= 0; i--) { if(s[i] > s[i + 1]) { s[i]--; flag = i + 1; } } for (int j = flag; j < s.size(); ++j){ s[j] = '9'; } return stoi(s); } };
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
局部最优:让叶子节点的父节点安摄像头,所用摄像头最少
全局最优:全部摄像头数量所用最少
class Solution { private: int res; int traversal(TreeNode* cur) { if (cur == NULL) return 2; int left = traversal(cur->left); // 左 int right = traversal(cur->right); // 右 if (left == 2 && right == 2) return 0; else if (left == 0 || right == 0) { res++; return 1; } else return 2; } public: int minCameraCover(TreeNode* root) { res= 0; if (traversal(root) == 0) { // root 无覆盖 res++; } return res; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。