分析 二分查找的题目,和吃香蕉的题目思路类似。根据题意最小的运送能力应该是max(nums),这样一来用nums.size天运输完。最大的运送能力是sum(nums),这样一来用1天就可以运送完毕。只需要使用找这两个数中间的最小的完成运送的数即可。 代码
class Solution {
public :
int shipWithinDays ( vector< int > & weights, int D) {
int left = max ( weights) ;
int right = sum ( weights) ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( cando ( weights, D, mid) ) {
right = mid - 1 ;
} else {
left = mid + 1 ;
}
}
return left;
}
bool cando ( const vector< int > & weights, int D, int weight) {
int sum = 0 ;
int size = weights. size ( ) ;
int i = 0 ;
int temp;
while ( i < size) {
temp = 0 ;
while ( i < size) {
if ( temp + weights[ i] <= weight) {
temp = temp + weights[ i++ ] ;
} else {
break ;
}
}
sum++ ;
if ( sum > D) return false ;
}
if ( sum <= D) return true ;
return false ;
}
int max ( const vector< int > & weights) {
int size = weights. size ( ) ;
int max = 0 ;
for ( int i = 0 ; i < size; i++ ) {
if ( weights[ i] > max) {
max = weights[ i] ;
}
}
return max;
}
int sum ( const vector< int > & weights) {
int size = weights. size ( ) ;
int sum = 0 ;
for ( int i = 0 ; i < size; i++ ) {
sum + = weights[ i] ;
}
return sum;
}
} ;