Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情
一、题目描述
给定一个数组 nums,求一个数组 ans ,ans[i] 等于 nums 中 除了 nums[i]之外的其余各元素的乘积。 说得土一点,就是求 剔除当前位置后的所有数字的乘积之和,且不能使用除法。
二、思路分析
朴素做法: 循环两次,暴力算
不朴素的做法: 先求一下前缀积和后缀积,之后就可以 O(1) 求出每个位置的 ans 了。
三、AC代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int a[100005],b[100005];
int n=nums.size();
a[0] = nums[0];
b[n-1] = nums[n-1];
for (int i=1; i<n; i++) {
a[i] = a[i-1] * nums[i];
}
for (int i=n-2; i>=0; i--) {
b[i] = b[i+1] * nums[i];
}
nums[0] = b[1];
nums[n-1] = a[n-2];
for (int i=1; i<n-1; i++) {
nums[i] = a[i - 1] * b[i + 1];
}
return nums;
}
};
四、总结
该题为中等题,适合练练手感。 前缀和问题在算法中非常常见,属于基本操作,大多数时候是非常有用的,可以有效降低我们的复杂度,提高信息的利用率。只是这题比较裸,不容易 get 到它的好用之处。