← All problems

1508. Range Sum of Sorted Subarray Sums

MediumOpen on LeetCodeProblem statement

Problem Statement

1508. Range Sum of Sorted Subarray Sums

Medium


You are given the array nums consisting of n positive integers. You computed the sum of all non-empty continuous subarrays from the array and then sorted them in non-decreasing order, creating a new array of n * (n + 1) / 2 numbers.

Return the sum of the numbers from index left to index right (indexed from 1), inclusive, in the new array. Since the answer can be a huge number return it modulo 109 + 7.

 

Example 1:

Input: nums = [1,2,3,4], n = 4, left = 1, right = 5
Output: 13 
Explanation: All subarray sums are 1, 3, 6, 10, 2, 5, 9, 3, 7, 4. After sorting them in non-decreasing order we have the new array [1, 2, 3, 3, 4, 5, 6, 7, 9, 10]. The sum of the numbers from index le = 1 to ri = 5 is 1 + 2 + 3 + 3 + 4 = 13. 

Example 2:

Input: nums = [1,2,3,4], n = 4, left = 3, right = 4
Output: 6
Explanation: The given array is the same as example 1. We have the new array [1, 2, 3, 3, 4, 5, 6, 7, 9, 10]. The sum of the numbers from index le = 3 to ri = 4 is 3 + 3 = 6.

Example 3:

Input: nums = [1,2,3,4], n = 4, left = 1, right = 10
Output: 50

 

Constraints:

Java

Source file
class Solution {
    public int rangeSum(int[] nums, int n, int left, int right) {
        int idx = 0;
        int[] arr = new int[n * (n + 1) / 2];
        arr[0] = nums[0];
        for (int i = 1; i < n; i++)
            arr[++idx] = nums[i] += nums[i - 1];
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j < n; j++)
                arr[++idx] = nums[j] - nums[i]; // subarray sum
        // System.out.println(Arrays.toString(arr));
        Arrays.sort(arr);
        // System.out.println(Arrays.toString(arr));
        int mod = (int) 1e9 + 7, sum = 0;
        for (int i = left - 1; i < right; i++)
            sum = (sum + arr[i]) % mod;
        return sum;
    }
}