283.除自身以外数组的乘积(前缀积、C解法)

题目描述:

给你一个整数数组 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]

前缀积解法:

cpp 复制代码
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    int* ans = (int *)malloc(sizeof(int) * numsSize);
    *returnSize=numsSize;

    ans[0]=1;
    for(int i=1;i<numsSize;i++){
        ans[i]=ans[i-1]*nums[i-1];
    }
    int r=1;
    for(int i=numsSize-1;i>=0;i--){
        ans[i]*=r;
        r*=nums[i];
    }
    return ans;
}

分析:

该思路和前缀和有点类似,即计算下一个元素的积时有很大一部分计算是与计算上一个元素的积重复的,用前缀积数组存储计算值,在该值的基础上进行下一个计算,减少了重复运算,达到降低时间复杂度的效果。

每一个元素除自身以外数组的积可以分解为前缀积乘以后缀积,后缀积求法与前缀积类似,只是遍历的顺序相反。可以用两个数组,两个for循环分别求前缀积、后缀积,再用一个数组,一个for循环计算题解,这种解法思路更直接,但开了三个数组空间复杂度高。本解法选择用一个for循环将题解数组当作前缀积数组,再用一个for循环同时计算后缀积和题解,这样只开了一个数组。

需注意,函数中定义的数组(int ansreturnSize;)是局部变量,离开函数后会自动释放,不能用return传出去,必须用malloc定义数组。

相关推荐
山登绝顶我为峰 3(^v^)31 天前
C/C++ 交叉编译方法
java·c语言·c++
还有多久拿退休金1 天前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby1 天前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀1 天前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince1 天前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>1 天前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
LONGZETECH1 天前
新能源汽车动力电池检测仿真教学系统:C/S 分层架构与数字化实训落地全解析
大数据·c语言·开发语言·人工智能·架构·系统架构·汽车
researcher-Jiang1 天前
算法训练:堆 & 可并堆
算法
在书中成长1 天前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶1 天前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展