【LeetCode 面试经典150题】238. Product of Array Except Self 除自身以外数组的乘积
2024-01-03 14:41:29
238. Product of Array Except Self
题目大意
Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].
The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
You must write an algorithm that runs in O(n) time and without using the division operation.
中文释义
给定一个整数数组 nums
,返回一个数组 answer
,使得 answer[i]
等于除 nums[i]
之外的 nums
的所有元素的乘积。
nums
的任何前缀或后缀的乘积都保证适合在 32 位整数中表示。
你必须编写一个时间复杂度为 O(n) 的算法,并且不使用除法运算。
Example
Example 1:
- Input:
nums = [1,2,3,4]
- Output:
[24,12,8,6]
Example 2:
- Input:
nums = [-1,1,0,-3,3]
- Output:
[0,0,9,0,0]
Constraints
2 <= nums.length <= 10^5
-30 <= nums[i] <= 30
nums
的任何前缀或后缀的乘积都保证适合在 32 位整数中表示。
Follow up
能否在 O(1) 额外空间复杂度内解决问题?(输出数组不计入空间复杂度分析)
解题思路
算法描述
这段代码的目的是计算一个数组 nums
,使得每个元素 answer[i]
等于除了 nums[i]
之外的所有元素的乘积。
定义临时变量left
记录当前位置之前所有元素的乘积,right
记录当前位置之后所有元素的乘积。
算法的关键步骤如下:
-
初始化结果数组:
- 创建一个与
nums
大小相同的数组answers
,用于存储最终的乘积结果。
- 创建一个与
-
计算左侧乘积:
- 初始化一个变量
left
为1,用于存储当前索引左侧所有元素的乘积。 - 遍历
nums
数组,对于每个索引i
,将left
赋值给answers[i]
,然后更新left
为left * nums[i]
。这样,answers[i]
就存储了索引i
左侧所有元素的乘积。
- 初始化一个变量
-
计算右侧乘积并合并结果:
- 初始化一个变量
right
为1,用于存储当前索引右侧所有元素的乘积。 - 反向遍历
nums
数组,对于每个索引i
,将answers[i]
乘以right
,然后更新right
为right * nums[i]
。这样,answers[i]
就同时包含了索引i
左侧和右侧所有元素的乘积。
- 初始化一个变量
-
返回结果:
- 返回填充好的
answers
数组。
- 返回填充好的
代码示例
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> answers(nums.size());
int left = 1, right = 1;
for (int i = 0; i < nums.size(); i++) {
answers[i] = left;
left *= nums[i];
}
for (int i = nums.size() - 1; i >= 0; i--) {
answers[i] = answers[i] * right;
right *= nums[i];
}
return answers;
}
};
文章来源:https://blog.csdn.net/qq_43513394/article/details/135361882
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!