56. 合并区间
思路与重点
如何去模拟合并区间呢?其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。
注意lambda表达式的用法,可以简化代码!
class Solution {
public :
vector< vector< int >> merge ( vector< vector< int >> & intervals) {
vector< vector< int >> result;
if ( intervals. size ( ) == 0 ) return result;
sort ( intervals. begin ( ) , intervals. end ( ) , [ ] ( const vector< int > & a, const vector< int > & b) { return a[ 0 ] < b[ 0 ] ; } ) ;
result. push_back ( intervals[ 0 ] ) ;
for ( int i = 1 ; i < intervals. size ( ) ; i++ ) {
if ( result. back ( ) [ 1 ] >= intervals[ i] [ 0 ] ) {
result. back ( ) [ 1 ] = max ( result. back ( ) [ 1 ] , intervals[ i] [ 1 ] ) ;
} else {
result. push_back ( intervals[ i] ) ;
}
}
return result;
}
} ;
738.单调递增的数字
思路与重点
本题只要想清楚个例,例如98,**一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。**就可以很自然想到对应的贪心解法了。
想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。
最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9 。
class Solution {
public :
static bool cmp ( const vector< int > & a, const vector< int > & b) {
return a[ 0 ] < b[ 0 ] ;
}
int eraseOverlapIntervals ( vector< vector< int >> & intervals) {
sort ( intervals. begin ( ) , intervals. end ( ) , cmp) ;
int ans = 0 ;
for ( int i = 1 ; i < intervals. size ( ) ; i++ ) {
if ( intervals[ i] [ 0 ] < intervals[ i- 1 ] [ 1 ] ) {
ans++ ;
intervals[ i] [ 1 ] = min ( intervals[ i] [ 1 ] , intervals[ i- 1 ] [ 1 ] ) ;
}
}
return ans;
}
} ;
968.监控二叉树
思路与重点
我们要从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
大体思路就是从下往上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。
如何隔两个节点放一个摄像头:此时需要状态转移的公式,大家不要和动态的状态转移公式混到一起,本题状态转移没有择优的过程,就是单纯的状态转移!来看看这个状态应该如何转移,先来看看每个节点可能有几种状态:
0:该节点无覆盖
1:本节点有摄像头
2:本节点有覆盖
class Solution {
private :
int result;
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 ) {
result++ ;
return 1 ;
} else return 2 ;
}
public :
int minCameraCover ( TreeNode* root) {
result = 0 ;
if ( traversal ( root) == 0 ) {
result++ ;
}
return result;
}
} ;
贪心算法总结