238. Product of Array Except Self
题目要求不能用除法,只能老老实实乘。
记 left[i] 为从左乘到 a[i-1],right[i] 为从右乘到 a[i+1],则 res[i] = left[i]*right[i] 。
由于 left[i] 和 right[i] 都只依赖前一个状态,因此可以用一个变量来代替数组。
这道题给人一种强烈的DP的感觉。实际上,遍历数组求和也能看做是DP的简化,把这道题当做DP来看也没问题的,只不过太简单了,tag里都没有DP。
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { // left[i]*right[i] int n=nums.size(); vector<int> left(n,1), right(n,1); for (int i=1;i<n;++i) left[i] = left[i-1]*nums[i-1]; for (int i=n-2;i>=0;--i) right[i] = right[i+1]*nums[i+1]; vector<int> res(n); for (int i=0;i<n;++i) res[i]=left[i]*right[i]; return res; } };
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { // left[i]*right[i] int n=nums.size(); int left=1, right=1; vector<int> res(n,1); for (int i=1;i<n;++i){ left *= nums[i-1]; res[i] *= left; } for (int i=n-2;i>=0;--i){ right *= nums[i+1]; res[i] *= right; } return res; } };

浙公网安备 33010602011771号