拼多多服务端实习生笔试-滑动窗口2018/4/3
有一整数数组A[n],滑动窗口大小为k,在A上从左到右移动,每次一步,求此过程中每步的子数组的最大值与最小值的差值
eg:
数组A=1 3 -1 -3 5 3 6 7 k=3
滑动窗口的位置 最大值 最小值 差值
[1 3 -1 -3] 5 3 6 7 3 -1 4
1 [3 -1 -3] 5 3 6 7 3 -3 6
1 3[ -1 -3 5 ]3 6 7 5 -3 8
....
输入:
第一行:n k n代表数组A的长度,k代表滑动窗口大小
第二行:n个整数,即为A数组
输出:包含n-k+1个整数,表示每步的子数组的最大值与最小值的差值
样例:
输入
8 3
1 3 -1 -3 5 3 6 7
输出
4 6 8 8 3 4
两种语言,方法相同
C++(没有提交,不确定会不会超时)
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <cstdlib> #include <algorithm> using namespace std; int a[100005]; int main() { int n,k; int maxs,mins; while(scanf("%d%d",&n,&k)) { for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } maxs=a[1]; mins=a[1]; for(int j=2; j<=k; j++) { if(a[j]>maxs) maxs=a[j]; if(a[j]<mins) mins=a[j]; } printf("%d",maxs-mins); for(int i=k+1; i<=n; i++) { if(a[i-k]==maxs||a[i-k]==mins) { maxs=a[i-k+1]; mins=a[i-k+1]; for(int j=i-k+2; j<=i; j++) { if(a[j]>maxs) maxs=a[j]; if(a[j]<mins) mins=a[j]; } } else { if(a[i]>maxs) { maxs=a[i]; } if(a[i]<mins) { mins=a[i]; } } printf(" %d",maxs-mins); } printf("\n"); } return 0; }
python3(AC)
n_k = input() n,k = map(int,n_k.split(' ')) data = input() _list = list(map(int,data.split(' '))) anslist = [] slide = _list[0:k] _max = max(slide) _min = min(slide) anslist.append(_max-_min) for poi in range(n-k): if _list[poi] == _max: _max = max(_list[poi+1:poi+k+1]) _min = min(_min,_list[poi+k]) elif _list[poi] == _min: _min = min(_list[poi+1:poi+k+1]) _max = max(_max,_list[poi+k]) else: _max = max(_max,_list[poi+k]) _min = min(_min,_list[poi+k]) anslist.append(_max-_min) print(' '.join(map(str,anslist)))