1814. 所有子数组之和
给定一个数组nums, 你需要返回这个数组所有子数组之和。
样例
示例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
注意事项
-
如果nums = [2, 4, 1], 数组所有的子集是 {[2], [4], [1], [2, 4], [4, 1], [2, 4, 1]}
-
保证返回的结果是int的类型
public class Solution {
/**
* @param nums: a Integer list
* @return: return the sum of subarrays
*/
public int SubArraySum(int[] nums) {
int sum = 0;
// 每一个数字都可以跟左边组合和右边组合,组成一串数字
for (int i = 0; i < nums.length; i++) {
// 数字 * 左边可能性 * 右边可能性
sum += nums[i] * (i + 1) * (nums.length - i);
}
return sum;
}
}
V1. 排列组合,每个数字出现的次数 = 左边*右边
跟标答一样
public int SubArraySum(int[] nums) {
int sum = 0;
// 每一个数字都可以跟左边组合和右边组合,组成一串数字
for (int i = 0; i < nums.length; i++) {
// 数字 * 左边可能性 * 右边可能性
sum += nums[i] * (i + 1) * (nums.length - i);
}
return sum;
}
V2.
这是所有子序列(非连续)的和
n个数字的全排列 = 2 ^ n
n个数字的全组合 = n!
public int SubArraySum(int[] nums) {
// 除去当前数字,还有几个数字
int n = (int)Math.pow(2, nums.length - 1);
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum * n;
}