📍前言
🕺作者: 迷茫的启明星
学习路线 C语言从0到1 C++初阶 数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言
🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!
持续更新中~
[【前缀和】238. 除自身以外数组的乘积 剑指 Offer 66. 构建乘积数组
](https://leetcode.cn/problems/product-of-array-except-self/description/)
~注:两个题目一样~
问题描述
给定一个整数数组 nums
,要求返回一个新的数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请**不要使用除法,**且在 O(n)
时间复杂度内完成此题。
思路分析
首先,创建一个与输入数组 nums
大小相同的空数组 answer
,用于存储结果。接着,定义两个变量 left
和 right
,分别表示当前元素左侧所有元素的乘积和右侧所有元素的乘积。初始值设为 1。
接下来,遍历数组 nums
,对于每个元素 nums[i]
,将其左侧所有元素的乘积 left
乘到 answer[i]
上,然后将 nums[i]
乘到 left
上。同时,将其右侧所有元素的乘积 right
乘到 answer[n-1-i]
上,然后将 nums[n-1-i]
乘到 right
上。
遍历完成后,answer
数组中的每个元素 answer[i]
都是 nums
中除 nums[i]
之外其余各元素的乘积。最后返回 answer
数组。
题解与代码
这是一个求解给定数组中除自身元素之外其他元素乘积的问题。题目要求在 O(n) 时间复杂度内完成此题,且不能使用除法。以下是一种解题思路和代码实现。
C++
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> answer(n, 1);
int left = 1;
int right = 1;
for (int i = 0; i < n; ++i) {
answer[i] *= left;
left *= nums[i];
answer[n - 1 - i] *= right;
right *= nums[n - 1 - i];
}
return answer;
}
};
总结
这道题主要考察了数组操作的技巧。通过维护两个变量 left
和 right
来记录当前元素左侧和右侧所有元素的乘积,避免了使用除法。同时,在 O(n) 时间复杂度内完成了题目要求。在实际编程过程中,要注意数组边界的处理,确保不出现数组越界等错误。
本文由mdnice多平台发布