238. 除自身以外数组的乘积

该博客讨论了一种在O(n)时间复杂度和常数空间内计算数组中每个元素去除自身后的乘积的方法。博主提出创建两个数组分别存储元素左侧和右侧的乘积,然后通过双指针技术和动态累积更新,避免了除法操作和额外空间的使用,确保了在数组包含0时的正确性。解决方案包括一个前向遍历计算左侧乘积,一个后向遍历计算右侧乘积,最后结合得到结果。
摘要由CSDN通过智能技术生成

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

难点:请不要使用除法,且在 O(n) 时间复杂度内完成此题。并且在常数空间内完成,输出数组不被视为额外空间 。

-------------------------------------------------------------------------------------------------------------------------------

        原本以为多个循环会增加复杂度,最后发现只要不是嵌套循环就不会增加复杂度,因此时间复杂度不是本次问题的难点,并且不能保证不会出现数列中存在0的情况,因此将所有数相乘再除以对应位置的方法不能保证全部正确。

        可以创建两个数组,一个用来存储i位置左侧的全部数值乘积,一个用来存储i位置右侧的全部数值乘积,通过两个循环得到这两个数组,最后在通过一个循环将两者对应位置相乘得到输出结果。但这样空间复杂度为n,如果能使用数组实现上述全部过程即可满足题目要求的;输出数组不被视为额外空间 下的常数空间复杂度。可以用一个数组记录第一个数组,一个常数动态记录右侧值,最后对应位置相乘更新第一个·循环得到的数组并输出。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int>answer(n);
        answer[0]=1;
        for(int i=1;i<n;++i)//此处使用1开始循环,因为0左侧的已经定义了
        {
            answer[i]=nums[i-1]*answer[i-1];
        }
        int right=1;
        for(int i=n-1;i>=0;--i)//这里从n-1开始,因为n-1右侧的虽然已经定义了,但此时answer里面放的是最终输出值
        {
            answer[i]=answer[i]*right;
            right*=nums[i];
            
        }
        return answer;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值