求一个数组集合的所有子集以及其宽度解法

对于长度为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;
}}

猜你喜欢

转载自blog.csdn.net/hgtjcxy/article/details/81840581