0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[100%] MaxDoubleSliceSum (codility lessons)

Last updated at Posted at 2021-09-28

Lesson9

Maximum slice problem

Open reading material (PDF)

Medium

MaxDoubleSliceSum

Find the maximal sum of any double slice.

Task description

A non-empty array A consisting of N integers is given.

A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.

The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1] + A[Y + 1] + A[Y + 2] + ... + A[Z − 1].

For example, array A such that:

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

contains the following example double slices:

  • double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,
  • double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,
  • double slice (3, 4, 5), sum is 0.

The goal is to find the maximal sum of any double slice.

Write a function:

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

that, given a non-empty array A consisting of N integers, returns the maximal sum of any double slice.

For example, given:

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

the function should return 17, because no double slice of array A has a sum of greater than 17.

Write an efficient algorithm for the following assumptions:

  • N is an integer within the range [3..100,000];
  • each element of array A is an integer within the range [−10,000..10,000].

Code Walkthrough

class Solution {
    public int solution(int[] A) {
        int[] prevSubSum = new int[A.length];
        int[] postSubSum = new int[A.length];

        for (int i = 1; i < A.length - 1; i++) {
            prevSubSum[i] = Math.max(0, prevSubSum[i - 1] + A[i]);
        }
        for (int i = A.length - 2; i > 0; i--) {
            postSubSum[i] = Math.max(0, postSubSum[i + 1] + A[i]);
        }
        int globalMaxSum = 0;
        for (int i = 1; i < A.length - 1; i++) {
            globalMaxSum = Math.max(prevSubSum[i - 1] + postSubSum[i + 1], globalMaxSum);
        }
        return globalMaxSum;
    }
}

Conclusion

  • Detected time complexity: O(N)
  • Detected space complexity: O(N)

Codility Report


See also: CodilityのLessonsをすべて解く(更新中)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?