For each possible start of a subarray, extend the subarray as long as the difference between consecutive elements is +1 or -1. Use prefix sums to quickly compute the sum of each valid subarray.
classSolution {
public:int sumOfConsecutiveSubarrays(vector<int>& nums) {
int n = nums.size(), mod =1e9+7;
vector<longlong> pre(n+1);
for (int i =0; i < n; ++i) pre[i+1] = pre[i] + nums[i];
longlong ans =0;
for (int i =0; i < n; ++i) {
// Increasing
int j = i;
while (j+1< n && nums[j+1] - nums[j] ==1) ++j;
for (int k = i; k <= j; ++k) ans = (ans + pre[k+1] - pre[i]) % mod;
i = j;
}
for (int i =0; i < n; ++i) {
// Decreasing
int j = i;
while (j+1< n && nums[j+1] - nums[j] ==-1) ++j;
if (j > i) {
for (int k = i+1; k <= j; ++k) ans = (ans + pre[k+1] - pre[i]) % mod;
}
i = j;
}
return (int)ans;
}
};
classSolution {
publicintsumOfConsecutiveSubarrays(int[] nums) {
int n = nums.length, mod = 1_000_000_007;
long[] pre =newlong[n+1];
for (int i = 0; i < n; i++) pre[i+1]= pre[i]+ nums[i];
long ans = 0;
for (int i = 0; i < n; ) {
int j = i;
while (j+1 < n && nums[j+1]- nums[j]== 1) j++;
for (int k = i; k <= j; k++) ans = (ans + pre[k+1]- pre[i]) % mod;
i = j + 1;
}
for (int i = 0; i < n; ) {
int j = i;
while (j+1 < n && nums[j+1]- nums[j]==-1) j++;
if (j > i) {
for (int k = i+1; k <= j; k++) ans = (ans + pre[k+1]- pre[i]) % mod;
}
i = j + 1;
}
return (int)ans;
}
}
classSolution {
funsumOfConsecutiveSubarrays(nums: IntArray): Int {
val n = nums.size
val mod = 1_000_000_007
val pre = LongArray(n+1)
for (i in0 until n) pre[i+1] = pre[i] + nums[i]
var ans = 0Lvar i = 0while (i < n) {
var j = i
while (j+1 < n && nums[j+1] - nums[j] ==1) j++for (k in i..j) ans = (ans + pre[k+1] - pre[i]) % mod
i = j + 1 }
i = 0while (i < n) {
var j = i
while (j+1 < n && nums[j+1] - nums[j] == -1) j++if (j > i) {
for (k in i+1..j) ans = (ans + pre[k+1] - pre[i]) % mod
}
i = j + 1 }
return ans.toInt()
}
}
classSolution:
defsumOfConsecutiveSubarrays(self, nums: list[int]) -> int:
mod =10**9+7 n = len(nums)
pre = [0] * (n +1)
for i in range(n):
pre[i+1] = pre[i] + nums[i]
ans =0 i =0while i < n:
j = i
while j+1< n and nums[j+1] - nums[j] ==1:
j +=1for k in range(i, j+1):
ans = (ans + pre[k+1] - pre[i]) % mod
i = j +1 i =0while i < n:
j = i
while j+1< n and nums[j+1] - nums[j] ==-1:
j +=1if j > i:
for k in range(i+1, j+1):
ans = (ans + pre[k+1] - pre[i]) % mod
i = j +1return ans
impl Solution {
pubfnsum_of_consecutive_subarrays(nums: Vec<i32>) -> i32 {
let n = nums.len();
let modn =1_000_000_007i64;
letmut pre =vec![0i64; n+1];
for i in0..n {
pre[i+1] = pre[i] + nums[i] asi64;
}
letmut ans =0i64;
letmut i =0;
while i < n {
letmut j = i;
while j+1< n && nums[j+1] - nums[j] ==1 { j +=1; }
for k in i..=j {
ans = (ans + pre[k+1] - pre[i]) % modn;
}
i = j +1;
}
i =0;
while i < n {
letmut j = i;
while j+1< n && nums[j+1] - nums[j] ==-1 { j +=1; }
if j > i {
for k in i+1..=j {
ans = (ans + pre[k+1] - pre[i]) % modn;
}
}
i = j +1;
}
ans asi32 }
}