求一個環內連續m個數的最大和

題目描述:

有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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章