题目描述
有 n
盒糖果 , 每盒糖果的数量为 a[i]
。 这 n
盒糖果从 1
到 n
的顺序顺时针方向摆成一个圆 , 索引为 n
的糖果盒顺时针方向的下一个糖果盒的索引为 1
, 对于其余的每盒糖果 , 编号为 i
的糖果盒顺时针的下一个糖果盒的索引为 i + 1
。
你可以选择任意一盒糖果, 然后从它开始顺指针方向那走连续的 k
盒糖果 , 问从哪盒糖果开始拿可以那最多的糖果 , 输出你选择的盒子的索引 。 如果有多重方案可以拿到最多的糖果则输出最小的索引 。
输入描述:
第一行两个整数 n , k ( 1 <= k <= n <= 100000)
第二行 n 个整数 a[i] (1 <= a[i] <= 100000)
输出描述:
输出一行一个整数,输出一个最小的索引
输入
3 2
1 2 3
输出
2
这是阿里的一道笔试真题 , 考点是 定长的滑动窗口
,但是值得注意的是,数据形成了一个环,如何处理环是本题的关键 ,最坏的情况就是从 n
开始连续拿 k
个盒子得到最大值 ,返回最小索引 n
, 此时需要通过 求余
把超出 n
的部分映射回数组前侧 。
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int k = input.nextInt();
int[] suger = new int[n];
for(int i = 0 ; i < n ; i ++){
suger[i] = input.nextInt();
}
// 先求出 0 - k 个盒子的总糖果数
int sum = 0;
for(int i = 0 ; i < k ; i ++){
sum += suger[i];
}
// 只需要保持每次左侧出一个 , 右侧加一个
int max_value = sum , pos = 0;
for(int i = k ; i < n + k ; i ++){
sum -= suger[i - k];
sum += suger[i % n];
if(max_value < sum){
max_value = sum;
pos = i - k + 1;
}
}
System.out.println(pos + 1);
}
}