LeetCode238. 除自身以外数组的乘积 前缀乘积和后缀乘积简单应用

题目描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

题目分析

看到题目后,被题目后面的进阶要求O(1)的空间吓到了。最后没有分析出用什么做法来。后面看了题解,一下就弄懂咋回事了。

简单描述下题解。声明L[i]表示nums[i]的左边所有数的乘积和,R[i]为nums[i]右边的所有乘积和。然后左边的乘积和乘右边的就是答案了。O(1)空间的话,就是去除R[i],用一个数累乘nums[i]就可以取得同样的效果。题目本身是中等难度,不过感觉就是简单题。

前置知识

  • vector L(len,0);//声明vector向量的时候同时申请长度,且将向量里面的值赋为0
  • L[0]=1;//vector向量赋值形式
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len=nums.size();
        int i=0,j=len;
        vector<int> L(len,0);
        vector<int> R(len,0);
       
        L[0]=1;
        R[len-1]=1;
        for(i=1;i<len;i++)
        {
            L[i]=L[i-1]*nums[i-1];
        }
        for(j=len-1;j>0;j--)
        {
            R[j-1]=R[j]*nums[j];
        }
        for(int k=0;k<len;k++)
        {
            nums[k]=L[k]*R[k];
        }
        return nums;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值