Maximum Sum Score of Array
MediumUpdated: Aug 2, 2025
Practice on:
Problem
You are given a 0-indexed integer array nums of length n.
The sum****score of nums at an index i where 0 <= i < n is the
maximum of:
- The sum of the first
i + 1elements ofnums. - The sum of the last
n - ielements ofnums.
Return _themaximum sum****score of _nums at any index.
Examples
Example 1:
Input: nums = [4,3,-2,5]
Output: 10
Explanation:
The sum score at index 0 is max(4, 4 + 3 + -2 + 5) = max(4, 10) = 10.
The sum score at index 1 is max(4 + 3, 3 + -2 + 5) = max(7, 6) = 7.
The sum score at index 2 is max(4 + 3 + -2, -2 + 5) = max(5, 3) = 5.
The sum score at index 3 is max(4 + 3 + -2 + 5, 5) = max(10, 5) = 10.
The maximum sum score of nums is 10.
Example 2:
Input: nums = [-3,-5]
Output: -3
Explanation:
The sum score at index 0 is max(-3, -3 + -5) = max(-3, -8) = -3.
The sum score at index 1 is max(-3 + -5, -5) = max(-8, -5) = -5.
The maximum sum score of nums is -3.
Constraints:
n == nums.length1 <= n <= 10^5-10^5 <= nums[i] <= 10^5
Solution
Method 1 – Prefix Sum and Suffix Sum
Intuition
To find the maximum sum score at any index, we need to consider the sum of the first i+1 elements and the sum of the last n-i elements for each index. The answer is the maximum among all these values. We can use prefix and suffix sums to compute these efficiently.
Approach
- Compute prefix sums for all indices.
- Compute suffix sums for all indices.
- For each index, calculate the sum score as the maximum of prefix and suffix sum at that index.
- Return the maximum sum score found.
Code
C++
class Solution {
public:
long long maximumSumScore(vector<int>& nums) {
int n = nums.size();
vector<long long> prefix(n), suffix(n);
prefix[0] = nums[0];
for (int i = 1; i < n; ++i) prefix[i] = prefix[i-1] + nums[i];
suffix[n-1] = nums[n-1];
for (int i = n-2; i >= 0; --i) suffix[i] = suffix[i+1] + nums[i];
long long ans = LLONG_MIN;
for (int i = 0; i < n; ++i)
ans = max(ans, max(prefix[i], suffix[i]));
return ans;
}
};
Go
func maximumSumScore(nums []int) int64 {
n := len(nums)
prefix := make([]int64, n)
suffix := make([]int64, n)
prefix[0] = int64(nums[0])
for i := 1; i < n; i++ {
prefix[i] = prefix[i-1] + int64(nums[i])
}
suffix[n-1] = int64(nums[n-1])
for i := n-2; i >= 0; i-- {
suffix[i] = suffix[i+1] + int64(nums[i])
}
ans := prefix[0]
for i := 0; i < n; i++ {
if prefix[i] > ans { ans = prefix[i] }
if suffix[i] > ans { ans = suffix[i] }
}
return ans
}
Java
class Solution {
public long maximumSumScore(int[] nums) {
int n = nums.length;
long[] prefix = new long[n], suffix = new long[n];
prefix[0] = nums[0];
for (int i = 1; i < n; ++i) prefix[i] = prefix[i-1] + nums[i];
suffix[n-1] = nums[n-1];
for (int i = n-2; i >= 0; --i) suffix[i] = suffix[i+1] + nums[i];
long ans = Long.MIN_VALUE;
for (int i = 0; i < n; ++i)
ans = Math.max(ans, Math.max(prefix[i], suffix[i]));
return ans;
}
}
Kotlin
class Solution {
fun maximumSumScore(nums: IntArray): Long {
val n = nums.size
val prefix = LongArray(n)
val suffix = LongArray(n)
prefix[0] = nums[0].toLong()
for (i in 1 until n) prefix[i] = prefix[i-1] + nums[i]
suffix[n-1] = nums[n-1].toLong()
for (i in n-2 downTo 0) suffix[i] = suffix[i+1] + nums[i]
var ans = Long.MIN_VALUE
for (i in 0 until n)
ans = maxOf(ans, maxOf(prefix[i], suffix[i]))
return ans
}
}
Python
class Solution:
def maximumSumScore(self, nums: list[int]) -> int:
n = len(nums)
prefix = [0] * n
suffix = [0] * n
prefix[0] = nums[0]
for i in range(1, n):
prefix[i] = prefix[i-1] + nums[i]
suffix[-1] = nums[-1]
for i in range(n-2, -1, -1):
suffix[i] = suffix[i+1] + nums[i]
ans = float('-inf')
for i in range(n):
ans = max(ans, prefix[i], suffix[i])
return ans
Rust
impl Solution {
pub fn maximum_sum_score(nums: Vec<i32>) -> i64 {
let n = nums.len();
let mut prefix = vec![0i64; n];
let mut suffix = vec![0i64; n];
prefix[0] = nums[0] as i64;
for i in 1..n { prefix[i] = prefix[i-1] + nums[i] as i64; }
suffix[n-1] = nums[n-1] as i64;
for i in (0..n-1).rev() { suffix[i] = suffix[i+1] + nums[i] as i64; }
let mut ans = i64::MIN;
for i in 0..n {
ans = ans.max(prefix[i]).max(suffix[i]);
}
ans
}
}
TypeScript
class Solution {
maximumSumScore(nums: number[]): number {
const n = nums.length;
const prefix: number[] = Array(n).fill(0);
const suffix: number[] = Array(n).fill(0);
prefix[0] = nums[0];
for (let i = 1; i < n; ++i) prefix[i] = prefix[i-1] + nums[i];
suffix[n-1] = nums[n-1];
for (let i = n-2; i >= 0; --i) suffix[i] = suffix[i+1] + nums[i];
let ans = -Infinity;
for (let i = 0; i < n; ++i)
ans = Math.max(ans, prefix[i], suffix[i]);
return ans;
}
}
Complexity
- ⏰ Time complexity:
O(n), wherenis the length of nums. We scan the array twice for prefix and suffix sums. - 🧺 Space complexity:
O(n), for the prefix and suffix arrays.