1、给定一个数组,值全是正数,请返回累加和为给定值k的最长子数组长度。
方法一:暴力求解,求出所有的子数组,共n*(n-1)/2个,然后对每个子数组求和,时间复杂度为O(n^3)
改进方法:因为数组值全是整数,所以长度为n的子数组和一定大于长度为n-1的子数组和(不管多的一项在子数组左边还是右边)。所以可以利用滑动窗口的思想来求解。调整窗口的长度及左右边界使其内的子数组和为k,求出最大窗口长度即可。
例如数组arr的下标为:0...left...right...n-1
left、right分别为滑动窗口的左右边界。
分析:
情况一:当sum[left...right]==k ,此时窗口的长度为最长,再扩展窗口必然会sum>k,记录更新窗口的长度len,并把左边界右移left++减小窗口长度;
情况二:当sum[left...right]<k,增加窗口长度,右边界右移right++;
情况三:当sum[left...right]>k,没有满足条件,减小窗口长度,左边界右移left++,
注意:窗口大小改变时,不要忘记更新sum的值。
时间复杂度:因为只设置了左右两个指针变量,判断