題目描述:
有n個小朋友,圍成一個圈,玩丟手絹的遊戲。現輸入一個數組表示每個小朋友被丟中的次數,同時輸入一個整數m(1<=m<=n),求出連續m個小朋友被丟中次數的和的最大值。
示例:
input:
5//數組大小n
1
2
3
4
5//數組的個元素值
3//連續m個小朋友
output:
12
思路:
思路還是比較簡單的:
假定輸入數組爲arr,連續m個小朋友
1. 求出一個基本值sum,max
for i between 0:(m-1) in arr
sum += arr[i];
max = sum;
2. len = arr.length.
sum1:表示從當前位置i開始,連續m個數值的和
sum1 = arr[i]+arr[i+1]+...+arr[i+m-1];
那麼,從下一個位置i+1開始,連續m個數值的和sum2,
sum2 = arr[i+1]+arr[i+1]+...+arr[i+m];
sum2 = sum1 - arr[i] + arr[i+m];
爲了避免每次迭代i都去判斷if(i >= len),然後再取模,這裏的循環直到i = len - m爲止,即疊加的最後一個元素爲arr[len - 1].這就都不用判斷if(i >= len)。
for i between m:(len - m) in arr
sum -= arr[i-1];
sum += arr[m];
if(sum > max)
max = sum;
3. j = 0, for i between (len - m + 1): (len -1) in arr
sum -= arr[i - 1];
sum += arr[j++];
if(sum > max)
max = sum;
根據上述分析,寫出代碼如下:
import java.util.Scanner;
/**
* @author Mengjun Li
* @create 2017/10/14
* @since 1.0.0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int i = 0;
int[] num = new int[n];
while (i < n) {
num[i++] = sc.nextInt();
}
int m = sc.nextInt();
System.out.println(solve(num, m));
}
public static int solve(int[] num, int m) {
if (num == null)
return 0;
int len = num.length;
if (len == 0)
return 0;
int sum = 0, max = 0;
for (int i = 0; i < m; i++)
sum += num[i];
max = sum;
for (int i = 1; i <= len - m; i++) {
sum -= num[i - 1];
sum += num[i + m-1];
if (max < sum)
max = sum;
}
for (int i = len - m + 1, j = 0; i < len; i++, j++) {
sum = sum - num[i - 1] + num[j];
if (max < sum)
max = sum;
}
return max;
}
}
輸入輸出:
input:
5
1
2
3
4
5
3
output:
12