SubarraySum(子数组总和)

问题

给定一个整数数组,求该数组所有子数组中所有元素的和。

例如,一个包含三个元素的数组[4,5,6]可以分成以下子数组:
1个元素数组:[4],[5],[6]
2个元素数组:[4,5],[5,6],[4,6]
3个元素数组:[4,5,6]

所有子数组中所有元素的和为:4 + 5 + 6 +(4+5)+(5+6)+(4+5+6)=50

解决思路

通过按位对应法来解决这个问题。
所有元素,在每个子数组中只有存在不存在两种状态。
逐位遍历进行所有子集

元素456子集
是否存在111[4,5,6]
110[4,5]
101[4,6]
100[4]
011[5,6]
010[5]
001[6]

源码

通过递归获取所有子数组,然后进行计算各数组所有元素总和

public int sum(int [] nums){
    boolean isInArray[] = new boolean[nums.length];
    List<List<Integer>> subArrays = new ArrayList<List<Integer>>();
    findSubArray(nums,0,isInArray,subArrays);
    int sum = 0;
    for(int i = 0;i<subArrays.size();i++){
        List<Integer> subArray = subArrays.get(i);
        System.out.println(subArray.toString());
        for(int j=0;j<subArray.size();j++){
            sum+=subArray.get(j);
        }
    }
    return sum;


}

public void findSubArray(int arr[],int index,boolean isInArray[],List<List<Integer>> subArrays){
    int length  = arr.length;
    if(index==length){
        List<Integer> subArray = new ArrayList<Integer>();
        for(int i = 0;i<length;i++){
            if(isInArray[i]){
                subArray.add(arr[i]);
            }
        }
        if(subArray.size()>0){
            subArrays.add(subArray);
        }
    }else{
        isInArray[index] = true;
        findSubArray(arr,index+1,isInArray,subArrays);
        isInArray[index] = false;
        findSubArray(arr,index+1,isInArray,subArrays);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值