个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【leetcode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
点击直接跳转到该题目
目录
- 1️⃣题目描述
- 2️⃣题目解析
- 3️⃣解题代码
1️⃣题目描述
给你一个整数数组 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 <= 1 0 5 10^{5} 105
- -30 <= nums[i] <= 30
- 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内
2️⃣题目解析
状态表示:
l[i]
:表示i
下标左边所有元素乘积之积(即[0,i - 1]
之间所有元素的乘积)。r[i]
:表示i
下标右边所有元素乘积之积(即[i + 1,n - 1]
之间所有元素的乘积)。
前缀积和后缀积表达式:
- 前缀积方程:
l[i] = l[i - 1] * nums[i - 1]
- 后缀积方程:
r[i[ = r[i + 1] * nums[i + 1]
3️⃣解题代码
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> l(n),r(n);l[0] = 1,r[n - 1] = 1;for(int i = 1;i < n;i++) l[i] = l[i - 1] * nums[i - 1];for(int i = n - 2;i >= 0;i--) r[i] = r[i + 1] * nums[i + 1];vector<int> answer(n);for(int i = 0;i < n;i++) answer[i] = l[i] * r[i];return answer;}
};
最后就通过啦!!!