对于长度为A.length的数组,构建一个长为A.length的01010这样的序列,然后其所有子集就是所有的01010这样的情况集合,共有2^A.length个。
//以下为1道leetcode题
对于每一个1000....0000至111...1111,都是经历先将0处变为1,再将1处变为1,再将2处变为1,直至将n-2处变为1。
而将0处变为1要用f(0),1处变为1要用f(1)。。。n-2处变为1要用f(n-2)。
对于将2处变为1,是先将1处变为1,再将0处变为1,再+1,此时最小的1位于2处
第一段代码为答案,第二段代码为思路
其核心仍是减而治之!
public static int sumSubseqWidths(int[] A) {
Arrays.sort(A);
// for(int i:A)System.out.println(i);
int sum=0;
long mod=(long) 1e9+7;
long c=1;
for(int n=0;n<A.length;n++,c=(c<<1)%mod)
{
long t2=(A[n]-A[A.length-n-1])*c;
sum+=t2%mod;
sum%=mod;
}
return (int)(sum%mod);
}
class Solution {
public int sumSubseqWidths(int[] A) {
Arrays.sort(A);
int sum=0;
for(int n=2;n<=A.length;n++)
{
for(int m=0;m<=n-2;m++)
{
sum+=(A[n-1]-A[m])*(Math.pow(2,n-2-m));
}
}
return sum;
}}