问题分析:

问题本身不难,如果可以用除法,直接计算数组中每个元素的乘积 k,然后res[i]=k/nums[i]。
但是题目限定不能用除法,如果不限定时间复杂度的话,每个元素都遍历一遍原数租。
但是题目又限定了时间复杂度O(n)。那么应该如何实现呢。定义一个res[]数租,让res[0]=1,
res[i]=res[i-1]*nums[i-1],也就是res[i]保存的是前 i-1个 元素的乘积。那么与题目要求不符,
因为res[i]保存的是除nums[i]外所有元素的积,也就是还差后 n-i 个元素的积。
那么我们再用相同的办法从后往前,如果用空间O(n)的做法,就是在定义一个res_tmp[]。
res_tmp[i]保存的是后 n-i 个元素的乘积。那么res[i]=res_tmp[i+1]*nums[i+1]就是前 i-1 个元素的积与后
n-i 个元素的积的积。
那么如何实现空间复杂度O(1)呢,可以考虑修改原数租,让nums[i]保存原数组后 n-i 个元素的积,
这样就没有额外再申请空间。因为是修改原数组就需要两个临时变量,tmp1,tmp2。
开始操作前 让 tmp1=num[i+1],tmp2=nums[i],nums[i]=tmp1*nums[i+1],做完操作后再让tmp1=tmp2.
这样就实现了nums[i] 为原nums[] 的后 n-i 个元素的积。
还有不清楚的看下面代码,有相应的注释:

class Solution {
public:
    vector<int> timesExceptSelf(vector<int>& nums) {
        int n=nums.size();
        int tmp1,tmp2;
        vector<int> res(nums.size(),1);
        for(int i=1;i<n;++i) res[i]=res[i-1]*nums[i-1];//原数组前 i-1 个元素的积
        tmp1=nums[n-1],nums[n-1]=1;//tmp1每次保存原nums[i+1]
        for(int i=n-2;i>=0;i--) {//原数组修改为原数组后n-i个元素的积
            tmp2=nums[i];//保存原nums[i]
            nums[i]=tmp1*nums[i+1];//改变当前nums[i]
            tmp1=tmp2;//让tmp1=原nums[i]作为下一个的前一个
        }
        for(int i=0;i<n;++i) res[i]*=nums[i];//正序*倒序
        return res;
    }
};