滑动窗口 | 求最长连续子数组
题目:
给定一个数组 {3, 1, 2, 1} 和一个数字k =4。求这个数组的一个最长连续子数组,这个最长连续子数组中所有数字的和必须小于或等于k。 例如,上面这个例子中,连续子数组有这么多种情况: {3}, {1}, {2}, {1}, {3, 1}, {1, 2}, {2, 1}, {3, 1, 2}, {1, 2, 1}, {3, 1, 2, 1}。 其中符合条件的就只有{1, 2, 1}。
代码:
代码分析的数据跟题目不一样但是换汤不换药(╯▽╰ )
#include <iostream> #include<stdio.h> using namespace std; int main() { int arr[9] = { 1,1,1,9,9,1,1,1,1 };//存放基础数据 int k = 4;//目标 int sum[9]={}; int len[9]={}; //滑窗长度 int loclen = 0; //记录当前滑窗长度 int locsum = 0; //记录当前滑窗求和 int startindex = 0; //记录滑窗起始位置 for (int i = 0;i < 9;i++) { locsum = locsum + arr[i]; if (locsum > k) { locsum = locsum - arr[startindex]; startindex++; sum[i] = locsum; len[i] = loclen; } else { sum[i] = locsum; loclen = loclen + 1;//窗口长度自增 len[i] = loclen; } } printf("sum= "); for (int i = 0;i < 9;i++) printf(" %d ", sum[i]); printf("\nlen= "); for (int i = 0;i < 9;i++) printf(" %d ", len[i]); printf("\n"); return 0; }