思路:
sum(i)表示,则区间[a,b]的和:SUM(a,b)=sum(b)-sum(a)
因此题目:Sum(l,r) S 且要求 l-r值最小
尺取法:
1.设置l=r=0.
2.r++ 直到 sum(r) = SUM(l=0,r) S 注意:此时的 r 并非 最合适 的右端点
3.记录最优解 MinLength =
3.l++ 此时 sum(r)-arr[l] = SUM(l,r) 当SUM(l,r) < S 时,r又应向右移动...直到r到达最右侧
模板:
while(l<arr.length){
while( r 的判断条件){
.....
}
记录最优
l 移动
}
public class ChiQuFa {
public static void main(String[] args) {
int n=10;//len
int []arr= {5,1,3,5,10,7,4,9,2,8};
int S=15;
//
int l=0,r=0;
int minlen=n;
//让r不断向右探测,如果大于S则停止,然后l不断向右探测,直到探测完毕
int sum=0;
while(l<n) {
while(sum<S && r<n) {
sum+=arr[r++];
}
if(sum>S) {
minlen=Math.min(minlen, r-l);//不断迭代minlen
}
sum-=arr[l++];//当sum<S了.r再继续向右移动
}
System.out.println("ans:"+minlen);
}
}