Lesson 9 question 3 MaxDoubleSliceSum

源地址

https://app.codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/

MaxDoubleSliceSum(最大雙切片的和)

給定一個含有N個整數的非空數組A.三個數(X, Y, Z), 其中 0 ≤ X < Y < Z < N, 被叫做雙切片.
雙切片(X, Y, Z)的和是A[X + 1] + A[X + 2] + … + A[Y − 1] + A[Y + 1] + A[Y + 2] + … + A[Z − 1]的和.
比如:

 	A[0] = 3
    A[1] = 2
    A[2] = 6
    A[3] = -1
    A[4] = 4
    A[5] = 5
    A[6] = -1
    A[7] = 2

含有如下示例雙切片:

  • (0, 3, 6), 和爲 2 + 6 + 4 + 5 = 17,
  • (0, 3, 7), 和爲 2 + 6 + 4 + 5 − 1 = 16,
  • (3, 4, 5), 和爲 is 0.

寫一個函數,給定一個含有N個整數的非空數組A,返回最大雙切片的和.

	class Solution { 
		public int solution(int[] A); 
	}

比如在以上例子中,函數應該返回17.
假定:

  • N是範圍在 [3…100,000]的整數
  • A中的元素都是範圍在 [−10,000…10,000]的整數

第一步

雙切片(X, Y, Z)的和 就是範圍在X Y之間的數的和,但是去掉X,Y,Z這3個數.
建立兩個數組,分別儲存以Y爲基點,從1到N-1遍歷時,左切片和右切片的合的最大值.

	public int solution(int[] A) {
        int n = A.length;
        int[] maxLeft = new int[n];
        int[] maxRight = new int[n];

        for (int i = 1; i < n - 1; i++) {
            maxLeft[i] = Math.max(maxLeft[i - 1] + A[i], 0);
            maxRight[n - i - 1] = Math.max(maxRight[n - i] + A[n - i - 1], 0);
        }

        int max = 0;
        for (int i = 1; i < n - 1; i++) {
            max = Math.max(max, maxLeft[i - 1] + maxRight[i + 1]);
        }

        return max;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章