题目:

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

结果集中的任何一个元素 = 其左边所有的元素乘积 * 其右边所有元素的乘积,故可以这样:

一共遍历a数组两次,一次正向遍历,一次逆向遍历。

  • 正向遍历:创建辅助数组bb,其中left[i] = a[0] * a[1] ...* a[i-1] = left[i-1] * a[i-1],例如[1,2,3,4,5,6],left[2] = 1 * 2,left[3] = 1* 2 * 3 = left[2] * a[2]
  • 逆向遍历:当遍历至下标 i 时,right[i] = a[i+1] * a[i+2]... * a[n-1] = right[i+1] * a[i+1],例如[1,2,3,4,5,6],right[3] = 5 * 6,right[2] = 4* 5 * 6 = right[3] * a[3]

最后将b[i] = 正向遍历的结果  * 逆向遍历的结果,即b[i] = left[i] * right[i]。

代码:

 1 class Solution {
2 public int[] constructArr(int[] a) {
3 int len = a.length;
4 if ((len == 0) || a == null) return new int[0];
5 int[] b = new int[len];
6 int[] left = new int[len];
7 //初始化a[0]左边的乘积为1
8 left[0] = 1;
9 for (int i = 1; i < len; i++){
10 left[i] = left[i-1] * a[i-1];
11 }
12 int[] right = new int[len];
13 //初始化a[len-1]右边的乘积为1
14 right[len - 1] = 1;
15 for (int i = len - 2; i >= 0; i--){
16 right[i] = right[i+1] * a[i+1];
17 }
18 for(int i = 0; i < len; i++){
19 b[i] = left[i] * right[i];
20 }
21 return b;
22 }
23 }

参考:k神评论区各位老师的题解

剑指offer66(Java)-构建乘积数组(中等)的更多相关文章

  1. 剑指 Offer 66. 构建乘积数组 + 思维

    剑指 Offer 66. 构建乘积数组 Offer_66 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarre ...

  2. 剑指offer 66. 构建乘积数组(Leetcode 238. Product of Array Except Self)

    剑指offer 66. 构建乘积数组 题目: 给定一个数组A[0, 1, ..., n-1],请构建一个数组B[0, 1, ..., n-1],其中B中的元素B[i] = A[0] * A[1] * ...

  3. 力扣 - 剑指 Offer 66. 构建乘积数组

    题目 剑指 Offer 66. 构建乘积数组 思路1 按照一般的思路就是将所有的相乘,然后除以每一位数字就是答案,但是题目要求我们不能使用除法,因此我们会想到每次遍历到每个数字的时候,在遍历一遍数组, ...

  4. 【剑指Offer】构建乘积数组 解题报告(Python)

    [剑指Offer]构建乘积数组 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  5. 【Java】 剑指offer(66) 构建乘积数组

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[ ...

  6. Go语言实现:【剑指offer】构建乘积数组

    该题目来源于牛客网<剑指offer>专题. 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0] * A[1] * - * A[i ...

  7. 剑指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].不 ...

  8. [剑指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].不 ...

  9. 【剑指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].不能使用除法 ...

  10. 【剑指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].不 ...

随机推荐

  1. vscode 格式化 vue 和 js代码 vetur prettier beautify

    这个文档 不涉及eslint 只专注自动格式化 格式化个性化需求: js中 自动去分号 js中 双引号变单引号 最大空换行数 是2 vue template中 属性自动折行 vue 的自动格式化 需要 ...

  2. SecureCRT windows 登录 linux

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.SecureCRT支持SSH,同时支持Telnet和rlog ...

  3. k8s是如何保障滚动升级时下线的pod不被访问

    Kubernetes (k8s) 通过一系列机制保障在滚动升级时,下线的 Pod 不再被访问.以下是一些主要的保障措施: Service 抽象:在 Kubernetes 中,Pod 通常不是直接暴露给 ...

  4. Python使用pyecharts库构建股票交易 可交互可视化展示——基于Tushare大数据开放社区

    Python使用pyecharts库构建股票交易 可交互可视化展示--基于Tushare大数据社区 1.前言 大家好!欢迎各位访问我的博客,今天给大家分享的是 python使用pyecharts库构建 ...

  5. 记本地新建一个gradle方式springboot项目过程

    打算使用gradle在idea新建个springboot项目,然后坑很多,记录一下 原来我的idea应该是社区版,新建项目时候没有可以选择spring相关配置,然后卸载了重装,之前问题是启动是启动起来 ...

  6. MediaBox音视频终端SDK已适配鸿蒙星河版(HarmonyOS NEXT)

    2024年1月,HarmonyOS NEXT 鸿蒙星河版系统开发者预览版开放申请,该系统将只能安装为鸿蒙开发的原生应用,而不再兼容安卓应用.对此,阿里云MediaBox音视频终端SDK产品已实现功能的 ...

  7. 实时云渲染技术_如何助力VR虚拟现实走向成熟?

    近年来,虚拟现实(Virtual Reality, VR)技术在市场上的应用越来越广泛,虚拟现实已成为一个热门的科技话题.相关数据显示,2019年至2021年,我国虚拟现实市场规模不断扩大,从2019 ...

  8. Android 圆形进度条ProgressBar实现固定进度

    原文: Android 圆形进度条ProgressBar实现固定进度-Stars-One的杂货小窝 之前遇到一个问题,发现Android里的圆形进度条无法固定一个进度,记录一下解决方法 探究 假设我们 ...

  9. 记录--for in 和 for of的区别详解以及为for in的输出顺序

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { ...

  10. Oracle 隐式数据类型转换

    Oracle类型转换规则: 对于insert和update操作,oracle将值转换为受影响的的列的类型. 对于select操作,oracle会将列的值的类型转换为目标变量的类型. 看如下实验: 1. ...