尺取法Demo:

该文章介绍了一种使用尺取法解决编程问题的算法,即找到数组中和为给定值S的最小区间[l,r]。通过初始化l和r,不断移动r增加区间和,当和超过S时更新最小区间长度。最后,通过移动l并减去左侧元素保持区间和,直至遍历完整个数组。代码示例用Java实现。
摘要由CSDN通过智能技术生成

思路:

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);   
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值