欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【C++算法】28.前缀和_除自身以外数组的乘积

【C++算法】28.前缀和_除自身以外数组的乘积

2025/2/23 13:48:27 来源:https://blog.csdn.net/hlyd520/article/details/144203175  浏览:    关键词:【C++算法】28.前缀和_除自身以外数组的乘积

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

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


题目描述:

c237094360044e05077992913566c528


解法

暴力枚举:O(n2)

边枚举位置,边算乘积。

前缀和思想:

  1. 预处理前缀积和后缀积

f:前缀数组 这里面f[i]表示:[0,i-1]区间所有元素的积

g:后缀数组 这里面g[i]表示:[i+1,n-1]区间所有元素的积

f9276e056314b6db8f60a0577dd6aafd

f[i]=f[i-1]*nums[i-1]

g[i]=g[i+1]*nums[i+1]

  1. 使用ret数组存储i,使得i=f[i]*g[i]

  2. 注意细节问题,比如i=0的时候i-1不存在

    以及f[0]要设置为1g[n-1]设置为1

    因为如果f[0]=0,那么f[1]=0*nums[0]=0,后面就全0


C++ 算法代码:

class Solution 
{public:vector<int> productExceptSelf(vector<int>& nums) {// lprod 表示:[0, i - 1] 区间内所有元素的乘积// rprod 表示:[i + 1, n - 1] 区间内所有元素的乘积int n = nums.size();vector<int> lprod(n + 1), rprod(n + 1);lprod[0] = 1, rprod[n - 1] = 1;// 预处理前缀积以及后缀积for(int i = 1; i < n; i++)lprod[i] = lprod[i - 1] * nums[i - 1];for(int i = n - 2; i >= 0; i--)rprod[i] = rprod[i + 1] * nums[i + 1];// 处理结果数组vector<int> ret(n);for(int i = 0; i < n; i++)ret[i] = lprod[i] * rprod[i];return ret;}
};

图解

例如:nums = [1,2,3,4]

c7a7173f79648e3856195a14d57b5b97

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com