238. 除自身以外数组的乘积

type
status
date
slug
summary
tags
category
difficulty
icon
password

238. 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例 1:
示例 2:
提示:
  • 2 <= nums.length <= 105
  • 30 <= nums[i] <= 30
  • 输入 保证 数组 answer[i] 在 32 位 整数范围内
解题思路:
代码分析:
这道题的解题思路是利用前缀和后缀乘积的思想,通过两次遍历完成计算。具体步骤如下:
  1. 初始化:创建一个长度为n的结果数组res,所有元素初始化为1
  1. 第一次遍历(从左到右):
  • 计算每个位置左边所有数字的乘积
  • res[i] = res[i-1] * nums[i-1]
  • 此时res[i]存储了nums[0]到nums[i-1]的乘积
  1. 第二次遍历(从右到左):
  • 使用变量s记录右边的乘积,初始值为1
  • 对于每个位置i:
    • res[i] *= s (将左边的乘积和右边的乘积相乘)
    • s *= nums[i] (更新右边的乘积)
时间复杂度:O(n),需要两次遍历数组
空间复杂度:O(1),除了输出数组外,只使用了常数空间
举例说明:
对于输入数组 nums = [1,2,3,4]:
  • 第一次遍历后,res = [1,1,2,6]
    • res[0] = 1(初始值)
    • res[1] = 1 * 1 = 1
    • res[2] = 1 * 2 = 2
    • res[3] = 2 * 3 = 6
  • 第二次遍历(s表示右边的乘积):
    • i=3: s=1, res[3] = 6*1 = 6, s=4
    • i=2: s=4, res[2] = 2*4 = 8, s=12
    • i=1: s=12, res[1] = 1*12 = 12, s=24
    • i=0: s=24, res[0] = 1*24 = 24
最终输出:[24,12,8,6]
 
上一篇
自动化测试
下一篇
189. 轮转数组

评论
Loading...