# 1508. Range Sum of Sorted Subarray Sums
###### tags: `Leetcode` `Medium`
Link: https://leetcode.com/problems/range-sum-of-sorted-subarray-sums/
## 思路
### 暴力法 $O(N^2)$ $O(N^2)$
把所有sum算出来 然后再把l到r的加起来
### Binary Search (TLE) $O((r-l)*NlogN)$ $O(1)$
找到从l到r所有的subarray sum然后加起来
## Code
### 暴力法 $O(N^2)$ $O(N^2)$
```java=
class Solution {
public int rangeSum(int[] nums, int n, int left, int right) {
int[] ans = new int[n*(n+1) / 2];
int index = 0;
for(int i = 0; i<n; i++){
int sum = 0;
for(int j = i; j<n; j++){
sum += nums[j];
ans[index++] = sum;
}
}
Arrays.sort(ans);
long result = 0;
for(int i = left-1; i<right; i++){
result += ans[i];
}
return (int)(result % 1000000007);
}
}
```
### Binary Search (TLE) $O((r-l)*NlogN)$ $O(1)$
```java=
class Solution {
int totalSum = 0;
public int rangeSum(int[] nums, int n, int left, int right) {
int mod = 1000000007;
long ans = 0;
for(int num:nums) totalSum += num;
for(int i=left; i<=right; i++){
ans = (ans+kthSum(nums, i))%mod;
}
return (int)(ans%mod);
}
private long kthSum(int[] nums, int k){
int start=0, end=totalSum;
while(start<end){
int mid = start+(end-start)/2;
if(smallerOrEqual(nums, mid)<k){
start = mid+1;
}
else{
end = mid;
}
}
return start;
}
private int smallerOrEqual(int[] nums, int sum){
int l=0, r=0, curr=0, ans=0;
while(r<nums.length){
curr += nums[r];
while(curr>sum){
curr -= nums[l++];
}
ans += r-l+1;
r++;
}
return ans;
}
}
```