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;
    }
};

 

posted @ 2018-06-06 13:48  約束の空  阅读(115)  评论(0)    收藏  举报