当前位置: 首页 > news >正文

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:
2 <= nums.length <= 10 5 10^5 105
-30 <= nums[i] <= 30
输入 保证 数组 answer[i] 在 32 位 整数范围内


知识点:
数组、前缀乘积、后缀乘积


解1(优化前):
核心思想:用两个额外的辅助数组,存储每个位置的前缀乘积、后缀乘积。得到这两个数组后,遍历每个位置,结果值=当前位置的前缀乘积*当前位置的后缀乘积

辅助数组的初始值,需要设为1,因为计算的是乘积,而不是和。

时间复杂度: O ( n ) O(n) O(n)。每个for循环均最多遍历1次数组。
空间复杂度: O ( n ) O(n) O(n)。使用了两个辅助数组(题目说了分析空间复杂度时,不考虑输出数组)

class Solution {public int[] productExceptSelf(int[] nums) {//获取数组大小int n = nums.length;//定义结果数组int[] answer = new int[n];//定义辅助数组,存储前缀乘积、后缀乘积int[] pre = new int[n];int[] suf = new int[n];//辅助数组设置初始值(因为是乘积,所以是1)pre[0] = 1;suf[n - 1] = 1;//计算每个位置的前缀乘积for (int i = 1; i < n; i++) {pre[i] = pre[i - 1] * nums[i - 1];}//计算每个位置的后缀乘积for (int i = n - 2; i >= 0; i--) {suf[i] = suf[i + 1] * nums[i + 1];}//遍历每个元素,计算当前位置的结果值for (int i = 0; i < n; i++) {answer[i] = pre[i] * suf[i];}return answer;}
}

解2(优化后):
核心思想:
①先计算每个位置的后缀乘积
②然后在遍历每个元素的同时,将用变量(而非数组,这里就是优化的地方)代表的前缀乘积乘到后缀乘积中
③然后再更新前缀乘积,该前缀乘积用于下个位置的判断(这样说方便理解)
由于输出数组不在空间复杂度的考虑中,因此这里的后缀数组就是最终返回的输出数组。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)。没有用额外的辅助数组。

class Solution {public int[] productExceptSelf(int[] nums) {//获取数组大小int n = nums.length;//定义数组存储后缀乘积,并作为最后输出的结果数组int[] suf = new int[n];//数组设置初始值(因为是乘积,所以是1)suf[n - 1] = 1;//计算每个位置的后缀乘积for (int i = n - 2; i >= 0; i--) {suf[i] = suf[i + 1] * nums[i + 1];}//遍历每个元素,边计算前缀乘积,边计算当前位置的结果值int pre = 1;for (int i = 0; i < n; i++) {//结果值=前缀乘积*后缀乘积,此时已有每个位置的后缀乘积,从而得到结果值suf[i] *= pre;//计算前缀乘积,用于下一个位置的判断pre *= nums[i];}return suf;}
}

参考:
1、灵神解析

http://www.xdnf.cn/news/886753.html

相关文章:

  • 命名管道实现本地通信
  • 回溯算法复习(1)
  • Flash烧录速度和加载配置速度(纯FPGA ZYNQ)
  • 基于RK3568的多网多串电力能源1U机箱解决方案,支持B码,4G等
  • Selenium常用函数介绍
  • 深度解码:我如何用“结构进化型交互学习方法”与AI共舞,从学习小白到构建复杂认知体系
  • 【Web】D^3CTF 2025题解
  • 打卡Day45
  • Redis(02)Win系统如何将Redis配置为开机自启的服务
  • 如何选择专业数据可视化开发工具?为您拆解捷码全功能和落地指南!
  • Android 进程分类
  • 5G 网络中 DRX(非连续接收)技术深度解析
  • java: 找不到符号 符号: 变量 log
  • 【opencv】基础知识到进阶(更新中)
  • Modern C++(三)表达式
  • Kafka深度解析与原理剖析
  • MySQL数据库基础(一)———数据库管理
  • 华为OD最新机试真题-小明减肥-OD统一考试(B卷)
  • python编写赛博朋克风格天气查询程序
  • PyTorch中matmul函数使用详解和示例代码
  • vscode 离线安装第三方库跳转库
  • python3.9带 C++绑定的基础镜像
  • 【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析
  • 基于ResNet残差网络优化梯度下降算法实现图像分类
  • 编程技能:格式化打印05,格式控制符
  • 人工智能AI在数字化转型有哪些应用?
  • Android设置顶部状态栏透明,以及状态栏字体颜色
  • TDengine 开发指南—— UDF函数
  • 【JeecgBoot AIGC】AI知识库实战应用与搭建
  • 01 Deep learning神经网络的编程基础 二分类--吴恩达