剑指Offer第五十一题:构建乘积数组

构建乘积数组

https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&tqId=11204&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述
给定一个数组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] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

思路:这题主要是如何减少复杂程度;本来B[i]=B[i-1]A[i]/A[i-1],但是不能用除法,那么可以考虑分割开来算,先算前一半A[1]*A[2]...A[i-1],再算后一半A[i+1]..*A[n-1],然后相乘即为最后答案.前一段的规律就是后一个数等于前一个数乘上A[i-1],后一段相似,把它反过来可以避免除法;
public class Q_51 {

public int[] multiply(int[] A) {
    int[] first = new int[A.length];
    int[] back = new int[A.length];
    first[0] = back[0] = 1;
    for (int i = 1; i < A.length; i++) {
        first[i] = first[i - 1] * A[i - 1];
        back[i] = back[i - 1] * A[A.length - i];
    }
    int[] B = new int[A.length];
    for (int j = 0; j < A.length; j++) {
        B[j] = first[j] * back[A.length - j - 1];
    }
    return B;
}
public static void main(String[] args) {
    int[] A = {1, 2, 3, 4};
    System.out.println(Arrays.toString(new Q_51().multiply(A)));
}

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-12 18:53
第一次听说还有无水工作!!!又是被刷新三观的一天
Lynn012:666第一次听到,你给他说这里不方便我们加个微信
点赞 评论 收藏
分享
能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务