文章目录
- 1. 题目
- 2. 解题
- 2.1 暴力解
- 2.1 O(n) 解
1. 题目
给定一个数组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
https://tianchi.aliyun.com/oj/231203672248052266/245580596369363586
2. 解题
2.1 暴力解
class Solution {
public:/*** @param nums: a Integer list* @return: return the sum of subarrays*/int SubArraySum(vector<int> &nums) {// write your code hereint 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];}
};
2.1 O(n) 解
类似题目:
LeetCode 907. 子数组的最小值之和(单调栈)
LeetCode 891. 子序列宽度之和(数学)
每个数左右的数有多少个,包含自己,相乘就是方案数
class Solution {
public:/*** @param nums: a Integer list* @return: return the sum of subarrays*/int SubArraySum(vector<int> &nums) {// write your code hereint ans = 0, n = nums.size();for(int i = 0; i < nums.size(); ++i){ans += nums[i]*(i+1)*(n-i);}return ans;}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!