给定长度为n的数列整数a以及整数S,求出总和不小于S的连续子序列的长度的最小值,如果不存在,则输出0。
提供O(n)的解法:
对于一个连续的子序列,头为s,尾巴后一位为t,当子序列和>=S时,减去s,s右移动一位,同时更新最短长度(此操作在减去s之前完成);
当子序列的和小于S时,加一个p然后p右移。
只要有s,p其中一个越界时,程序就可返回最小长度。
感觉类似的子序列问题很多都存在线性时间的算法。
//
// 146_subsequence.cpp
// changlle
//
// Created by user on 1/8/16.
// Copyright (c) 2016 user. All rights reserved.
//
#include <iostream>
using namespace std;
const int INF=100;
int n=10;
int S=15;
int a[10]={5,1,3,5,10,7,4,9,2,8};
void solve() {
int s=0,t=0;
int sum=0;
int len=INF;
while (s<n && t<n) {
if (sum<S)
sum+=a[t++];
else {
len=min(len,t-s);
sum-=a[s++];
}
}
cout<<len<<endl;
}
int main() {
solve();
return 0;
}