题目
方法一:暴力数组记录
class Solution {
public :
bool isCovered ( vector< vector< int >> & ranges, int left, int right) {
bool check[ 51 ] = { 0 } ;
for ( auto && t: ranges) {
for ( int i= t[ 0 ] ; i<= t[ 1 ] ; i++ ) {
check[ i] = true ;
}
}
for ( int i= left; i<= right; i++ ) {
if ( ! check[ i] )
return false ;
}
return true ;
}
} ;
方法二:基于排序的贪心思想
class Solution {
public :
bool isCovered ( vector< vector< int >> & ranges, int l, int r) {
sort ( ranges. begin ( ) , ranges. end ( ) ) ;
int count = l;
for ( int i= 0 ; i< ranges. size ( ) ; i++ ) {
if ( count>= ranges[ i] [ 0 ] && count<= ranges[ i] [ 1 ] )
count = ranges[ i] [ 1 ] + 1 ;
if ( count> r)
return true ;
}
return false ;
}
} ;
方法三:暴力数组的优化,只更新重合部分
class Solution {
public :
bool isCovered ( vector< vector< int >> & ranges, int l, int r) {
bool check[ 51 ] = { false } ;
for ( auto && t: ranges) {
int left = t[ 0 ] , right = t[ 1 ] ;
left = max ( left, l) ;
right = min ( r, right) ;
for ( int i = left; i<= right; i++ ) {
check[ i] = true ;
}
}
for ( int i= l; i<= r; i++ ) {
if ( ! check[ i] )
return false ;
}
return true ;
}
} ;
方法四:差分+前缀和 进行验证
class Solution {
public :
bool isCovered ( vector< vector< int >> & ranges, int l, int r) {
int check[ 52 ] = { 0 } ;
for ( auto && t: ranges) {
check[ t[ 0 ] ] ++ ;
check[ t[ 1 ] + 1 ] -- ;
}
int sum[ 52 ] = { 0 } ;
sum[ 0 ] = check[ 0 ] ;
for ( int i= 1 ; i<= 51 ; i++ ) {
sum[ i] = sum[ i- 1 ] + check[ i] ;
if ( i>= l&& i<= r) {
if ( sum[ i] <= 0 )
return false ;
}
}
return true ;
}
} ;