• JZ51 构建乘积数组


    构建乘积数组

    给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
    收获:先把公式想清楚了再编程序就会思路清晰,写程序写的快。
    b[0] 1 A[1] A[2] A[n - 1]
    b[1] A[0] 1 A[2] A[n - 1]
    ....... A[0] A[1] A[2] A[n - 1]
    b[n - 2] A[0] A[1] 1 A[n - 1]
    b[n - 1] A[0] A[1] A[2] 1
    可以将B[i]分为两部分,左边乘以右边,B[i] = L[i] * R[i];
    L[0] = 1,L[i] = L[i - 1] * A[i - 1];
    R[n - 1] = 1,R[i] = R[i + 1] * A[i + 1];
    这样一写,for循环进行计算的时候就会不写错边界和初始化条件,注意因为不能使用除法,所以L要从0开始往下计算,R要从下往上进行计算。
    接下来考虑优化,只用一个vector就可以了,先将左边的遍历一遍,然后从右下角开始直接相乘计算得到结果。
      

    B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
    从左到右算B[i]=A[0]*A[1]*...*A[i-1]
    从右到左算B[i]*=A[i+1]*...*A[n-1]

    func multiply(a []int) []int {
        if len(a) <= 1 {
            return a
        }
        size := len(a)
    
        left, right := make([]int, size), make([]int, size)
        left[0] = 1
        for i := 1; i < size; i++{
            left[i] = left[i - 1] * a[i - 1]
        }
    
        right[size - 1] = 1
        for i := size - 2; i >= 0; i--{
            right[i] = right[i + 1] * a[i + 1] 
        }
    
        b := make([]int, size)
    
        for i := 0; i < size; i++{
            b[i] = left[i] * right[i]
        }
    
        return b
    }
  • 相关阅读:
    hdu_5791_Two(DP)
    hdu_5783_Divide the Sequence(贪心)
    hdu_5769_Substring(后缀数组)
    hdu_5778_abs(暴力)
    hdu_5776_sum(前缀和维护)
    hdu_5777_domino(贪心)
    [wikioi2069]油画(贪心)
    [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
    数据结构练习
    [poj3274]排排站(Hash)
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642188.html
Copyright © 2020-2023  润新知