我想到了一个办法,刚刚试了一下,确实是O(N)的。 思路就是从两头往中间凑,先得到全部的和,如果满足条件就返回了, 如果不满足,比较两头的大小,每次减去小的那个,然后走一步,代码如下: int maxSubLen( vector& data, int bar ) { int sz = data.size(), sum = 0; for( int i=0; iif( sum >= bar ) return sz;
int i = 0, j = sz-1; while( i < j ) { if( data[i] < data[j] ) sum -= data[i++]; else sum -= data[j--]; if( sum >= bar ) return j - i + 1; } return 0; } int main() { vector v {-1,-1,-1,2,-1,-1,100}; vector v2 {1,-1,-1,1,-1,-1,1,-1,-2,7}; vector v3 {-1,-1,-1,2,-1,-1,1}; cout<cout<cout<} 都在刷题奋力找工作中,共勉
【在 i******l 的大作中提到】 : 我想到了一个办法,刚刚试了一下,确实是O(N)的。 : 思路就是从两头往中间凑,先得到全部的和,如果满足条件就返回了, : 如果不满足,比较两头的大小,每次减去小的那个,然后走一步,代码如下: : int maxSubLen( vector& data, int bar ) { : int sz = data.size(), sum = 0; : for( int i=0; i: if( sum >= bar ) return sz; : : int i = 0, j = sz-1; : while( i < j ) {