首页 > 其他分享 >【剑指Offer】51、构建乘积数组

【剑指Offer】51、构建乘积数组

时间:2023-06-26 23:44:43浏览次数:41  
标签:... 乘积 Offer 51 数组 构建 计算

【剑指Offer】51、构建乘积数组

题目描述:

给定一个数组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[i]是A数组所有元素的乘积,但是没有A[i]项,如果没有不能使用除法这一限制,我们可以直接将A数组的所有元素相乘,得到一个乘积,记为res,则使用公式B[i] = res/A[i]即可得到B这个乘积数组。

现在有不能使用除法的限制,只能使用其他办法,当然,一个最直观的办法是每次计算B[i]时,都计算A数组中n-1个数字的乘积,显然这需要O(n^2)的时间复杂度。

仔细分析可以发现,这种暴力解法有很多重复的计算,我们可以通过一个简单的改变来避免这些重复计算。具体如下:

我们可以把B[i]=A[0]*A[1]*A[2]*···*A[i-1]*A[i+1]*···*A[n-1]看成是两部分的乘积,第一部分是i之前的所有项,记为C[i],即C[i]=A[0]*A[1]*A[2]*···*A[i-1],第二部分是i之后的所有项,记为D[i],即D[i]=A[i+1]*···*A[n-1]

经过这样的分隔后,数组B就相当于可以用如下的矩阵来构建,B[i]为矩阵中第i行所有元素的乘积。

由此,我们不难得出相应的规律:首先B[i]=C[i]*D[i],而C[i]可以通过自上而下的顺序进行计算,即C[0]=1,C[i]=C[i-1]*A[i-1],同理,D[i]可以通过自下而上的顺序进行计算,即D[len-1]=1,D[i]=D[i+1]*A[i+1]

代码如下所示,第一个for循环从上而下相当于计算C[i],第二个for循环自下而上相当于在C[i]的基础上乘以D[i]。显然时间复杂度为O(n)。

编程实现(Java):

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        /*
        思路:分成两部分的乘积,第一部分可以自上而下,第二部分自下而上
        */
        if(A==null||A.length<1)
            return A;
        int len=A.length;
        int[] B=new int[len]; 
        B[0]=1;
        for(int i=1;i<len;i++) //第一部分可以自上而下
            B[i]=B[i-1]*A[i-1];
        
        int temp=1;  //temp用来保存第二部分
        for(int i=len-2;i>=0;i--){ //第二部分可以自下而上
            temp=temp*A[i+1];
            B[i]=B[i]*temp;
        }
       return B;
    }
}

标签:...,乘积,Offer,51,数组,构建,计算
From: https://www.cnblogs.com/bujidao1128/p/17507479.html

相关文章

  • 剑指 Offer 09. 用两个栈实现队列
     ====思路:两个stack,stack1和stack2,如果stack2每只,stack1都没值返回-1,,如果stack1有值就把stack1的值都推到stack2中,返回stack2pop的值 ......
  • Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布)
    Xcode15beta2(15A5161b)发布下载-Apple平台IDE(visonOS1beta已发布)IDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS此版本已加入visonOS支持。请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • 【剑指Offer】40、数组中只出现一次的数字
    【剑指Offer】40、数组中只出现一次的数字题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。解题思路:这道题目相对比较难,一般情况下,我们首先可以想到的是顺序扫描数组,但其时间复杂......
  • CF519E A and B and Lecture Rooms
    题目链接题目见链接。题解知识点:倍增,LCA,树型dp。要找到距离两点\(u,v\)相同的点个数,我可以分类讨论:\(u,v\)是同一个点,那么全部点都可以。\(u,v\)处于相同深度,那么就是全部点减去\(LCA(u,v)\)的\(u,v\)两点所在子树的全部点。\(u,v\)不在相同深度,当\(u,v\)距......
  • GPT-4零失误通关大厂模拟面试,offer拿到手软?与AGI首次接触
    “GPT-4可被视作AGI(通用人工智能)的早期版本。”如若从他人口中说出,或许是无稽之谈——但是由微软雷蒙德研究院机器学习理论组负责人万引大神SébastienBubeck与2023新视野数学奖得主RonenEldan、2023新晋斯隆研究奖得主李远志、2020斯隆研究奖得主YinTatLee等科学家共同撰写的......
  • 【剑指Offer】37、数字在排序数组中出现的次数
    【剑指Offer】37、数字在排序数组中出现的次数题目描述:统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于数字3在该数组中出现了4次,所以函数返回4。解题思路:既然输入的数组是有序的,所以我们就能很自然的想到用二分查找算法。以题目中给的数......
  • 钉钉和抖音Android岗面筋,阿里挂了HR面,抖音通过收获Offer
    前言这一次的话,主要就是只投了钉钉和抖音两个部门,然后为了保险起见,让指导老师给我推荐了一个小公司,因为实在太想实习了,想着如果面试不上,总要有一个保底的机会。当然那家公司也挺nice的,我跟老总说了来意之后,老总直说让我全力冲,位置给我留着,所以在这里非常感谢吴总您对我的支持。阿里......
  • C语言 大小端转换(16位)c51,ARM
    //C++#include<arpa/inet.h>uint32_thtonl(uint32_tbuffer);//32位uint16_thtons(uint16_tbuffer);//16位Linux上,无符号c++版 #define__SWP16(A)((((uint16)(A)&0xff00)>>8)|\(((uint16)(A)&0x00ff)......
  • NC23051 华华和月月种树
    题目链接题目题目描述华华看书了解到,一起玩养成类的游戏有助于两人培养感情。所以他决定和月月一起种一棵树。因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的。华华和月月一起维护了一棵动态有根树,每个点有一个权值。刚开存档的时候,树上只有0号节点,权值为0......
  • 历时2个月喜提2字节安卓岗offer面试经验分享
    前言从2020年11月开始面试准备到2020年最后一天31号晚上7点收到短信offer,历时两个月,在熬夜猝死边缘疯狂试探的我,终于等来我梦寐以求的“跨年礼物”。“日尼玛,退钱”,《温暖的抱抱》电影前10分钟的开场剧情,让我不禁想着该如何说服朋友一起离场,却被自己短信铃声拉回了思绪,“应该调成静......