java数组子集_java – 所有可能的数组子集的乘积之和

你需要使用一点数学.假设您有3个值,就像您的示例一样,但我们称之为A,B和C.

要获得产品总和,您需要计算:

Result3 = A + B + C + A*B + A*C + B*C + A*B*C

= A + B + A*B + (1 + A + B + A*B) * C

现在,如果我们先计算A B A * B,称之为Result2,那么你会得到:

Result2 = A + B + A*B

Result3 = Result2 + (1 + Result2) * C

我们重复一遍,所以

Result2 = A + (1 + A) * B

Result1 = A

Result2 = Result1 + (1 + Result1) * B

你能看到这种模式吗?让我们使用4个值:

Result4 = A + B + C + D + A*B + A*C + A*D + B*C + B*D + C*D

+ A*B*C + A*B*D + A*C*D + B*C*D + A*B*C*D

= A + B + C + A*B + A*C + B*C + A*B*C

+ (1 + A + B + C + A*B + A*C + B*C + A*B*C) * D

= Result3 + (1 + Result3) * D

摘要:

Result1 = A

Result2 = Result1 + (1 + Result1) * B

Result3 = Result2 + (1 + Result2) * C

Result4 = Result3 + (1 + Result3) * D

作为代码,这是:

private static long sumProduct(int... input) {

long result = 0;

for (int value : input)

result += (result + 1) * value;

return result;

}

只有一次迭代,所以O(n).

测试

System.out.println(sumProduct(2, 3));

System.out.println(sumProduct(2, 3, 5));

System.out.println(sumProduct(2, 3, 5, 7));

产量

11

71

575

UPDATE

也可以使用带有Lambda表达式的Java 8 Streams使用IntStream.of(int...)或Arrays.stream(int[])(它们执行相同操作)来完成代码.

// Using IntStream with result as int

private static int sumProduct(int... input) {

return IntStream.of(input).reduce((a, b) -> a + (1 + a) * b).getAsInt();

}

// Using Arrays with result as long

private static long sumProduct(int... input) {

return Arrays.stream(input)

.asLongStream()

.reduce((a, b) -> a + (1 + a) * b)

.getAsLong();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值