每日一题《剑指offer》数组篇之构建乘积数组

今日题目链接:构建乘积数组

构建乘积数组

难度:简单

描述

给定一个数组 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](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])

对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。

数据范围

数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10

举例

解题思路

方法一:暴力法,直接将除了自身之外的数相乘即可获得答案

方法二:双向遍历


如上图所示,矩阵中由对角线1将其分成了上三角和下三角。我们先看下三角,如果我们累乘的时候,B[1]是在B[0]的基础上乘了新增的一个A[0],B[2]是在B[1]的基础上乘了新增的一个A[1],那我们可以遍历数组的过程中不断将数组B的前一个数与数组A的前一个数相乘就得到了下三角中数组B的当前数。同理啊,我们在上三角中,用一个变量存储从右到左的累乘,每次只会多乘上一个数字。这样,两次遍历就可以解决。

实现代码(java)

方法一:

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A int整型一维数组 
     * @return int整型一维数组
     */
    public int[] multiply (int[] A) {
        // write code here
        int n = A.length;
        int[] B = new int[n];
        for(int i = 0; i < n; i++){
            B[i] = cheng(A,i);
        }

        return B;
    }

    public int cheng(int[] A,int m){
        int sum = 1;
        for(int i = 0; i < A.length;i++){
            if(i!=m){
                sum *= A[i];
            }
        }
        return sum;
    }
}

方法二:

css 复制代码
import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        //初始化数组B
        int[] B = new int[A.length];
        B[0] = 1;
        //先乘左边,从左到右
        for(int i = 1; i < A.length; i++)
            //每多一位由数组B左边的元素多乘一个前面A的元素
            B[i] = B[i - 1] * A[i - 1];
        int temp = 1;
        //再乘右边,从右到左
        for(int i = A.length - 1; i >= 0; i--){
            //temp为右边的累乘
            B[i] *= temp;
            temp *= A[i];
        }
        return B;
    }
}
相关推荐
程序员一诺2 分钟前
【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】
后端·python·flask·框架
Bruce_Liuxiaowei3 分钟前
构建macOS命令速查手册:基于Flask的轻量级Web应用实践
前端·macos·flask
Asthenia04125 分钟前
如何在 Java 中正确判空 BigDecimal 等数据类型
后端
冷琅辞18 分钟前
Swift语言的跨平台开发
开发语言·后端·golang
Python私教28 分钟前
安装electron项目是为什么要执行postinstall script
前端·javascript·electron
·醉挽清风·28 分钟前
学习笔记—C++—入门基础()
c语言·开发语言·c++·笔记·学习·算法
Asthenia041232 分钟前
Pandas期末备考:常见问题解析
后端
今夜有雨.36 分钟前
使用C++实现HTTP服务
开发语言·网络·c++·后端·网络协议·tcp/ip·http
shmily_yyA37 分钟前
Nextjs15 实战 - React Notes之SidebarNoteList优化和Suspense的使用
前端·react.js·前端框架
知识分享小能手37 分钟前
CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)
前端·javascript·css·学习·css3·html5·媒体