给定一个数组nums, 你需要返回这个数组所有子数组之和。
如果nums = 2, 4, 1, 数组所有的子集是 {2, 4, 1, 2, 4, 4, 1, 2, 4, 1}
保证返回的结果是int的类型
len(nums) <= 50
示例
示例1:
输入: nums = [1, 2, 3]
输出: 20
解释: {1} + {2} + {3} + {2 + 3} + {1 + 2} + {1 + 2 + 3} = 20
示例2
输入: [1, 2]
输出: 6
解释: {1} + {2} + {1, 2} = 6
class Solution {
public:
/**
* @param nums: a Integer list
* @return: return the sum of subarrays
*/
int SubArraySum(vector<int> &nums) {
// write your code here
int ans = 0, n = nums.size();
vector<int> dp(n, 0);
dp[0] = nums[0]; // 前n个数的所有子数组的和
for(int i = 1; i < nums.size(); ++i)
{
int k = i+1;
dp[i] = dp[i-1];
while(k)
{
dp[i] += nums[k-1]*k;
k--;
}
}
return dp[n-1];
}
};
类似题目:LeetCode 907. 子数组的最小值之和(单调栈)
每个数左右的数有多少个,包含自己,相乘就是方案数
class Solution {
public:
/**
* @param nums: a Integer list
* @return: return the sum of subarrays
*/
int SubArraySum(vector<int> &nums) {
// write your code here
int ans = 0, n = nums.size();
for(int i = 0; i < nums.size(); ++i)
{
ans += nums[i]*(i+1)*(n-i);
}
return ans;
}
};