当前位置:   article > 正文

Leetcode238.除自身以外数组的乘积——前缀积与后缀积

前缀积

我们先来看下题目:

 函数接口:

  1. int* productExceptSelf(int* nums, int numsSize, int* returnSize)
  2. {
  3. }

(注:nums为数组首地址,numsSize为数组元素个数,returnSize为返回数组中元素的个数)

 我们看到这个题目,相信大多数人脑海中第一个浮现的想法是:

1、遍历数组,算出数组所有元素的乘积。

2、再次遍历数组,用第一步得到的答案分别对数组元素做除,并将结果存入一个新的数组。

      可是题目要求我们不能使用除法 ,这意味着我们只能使用乘法,将数组每个元素以外的所有元素的乘积都计算出来。可是如果数组包含的元素非常多,那么这样计算的时间复杂度将会极大。

我们有没有方法可以降低程序的复杂度呢?这里我们来引入一个方法:求数组的前缀积与后缀积。

  1. 前缀积(Prefix Product)方法:

    • 首先创建一个与原数组相同长度的结果数组,初始化值为1。
    • 从左到右遍历原数组,每次将当前元素与其前一个元素的前缀积相乘,并更新结果数组的值。
    • 最终结果数组中的每个元素即为该位置之前所有元素的乘积。
  2. 后缀积(Suffix Product)方法:

    • 首先创建一个与原数组相同长度的结果数组,初始化值为1。
    • 从右到左遍历原数组,每次将当前元素与其后一个元素的后缀积相乘,并更新结果数组的值。
    • 最终结果数组中的每个元素即为该位置之后所有元素的乘积。

我们了解思路后,下一步就是用代码实现我们的思想:

1、我们首先定义两个数组分别储存计算出的前缀积与后缀积,由于是乘法,我们先将prefix数组第一个元素和suffix数组最后一个元素都初始化为1。(也可以将遍历数组使所有元素都初始化为1)

  1. int prefix[100000];
  2. prefix[0]=1;
  3. int suffix[100000];
  4. suffix[numsSize-1]=1;

举一个例子:数组元素为 {1,2,3,4,5,6} ,当 i = 2时,nums[2] = 3。此时我们需要求除 3 以外其他所有元素的乘积。此时prefix[2]=1*2,suffix[2]=4*5*6。随着 i 的增加,前缀积逐渐增大,后缀积逐渐变小。所以我们数组设计的思路就是:随着下标逐渐增大,前缀积增大,后缀积减小。

2、前缀积(prefix)的计算 :

  1. for(i = 0;i < numsSize; i++)
  2. {
  3. prefix[i+1] = prefix[i] * nums[i];
  4. }

我们采用累乘的思路求出每个元素的前缀积,并记录下来。

3、 后缀积(suffix)的计算:

  1. for (i = 1; i < numsSize; i++)
  2. {
  3. suffix[numsSize - 1 - i] = suffix[numsSize - i] * nums[numsSize - i];
  4. }

4、将 每一个元素的前缀积与后缀积相乘 即为除自身以外数组元素的乘积。

     使用malloc函数向内存申请空间,创建一个新数组 arr ,用来返回除自身以外数组元素的乘积。

  1. int *arr = (int *)malloc(numsSize*sizeof(int));
  2. for(i = 0;i < numsSize; i++)
  3. {
  4. arr[i] = prefix[i] * suffix[i];
  5. }
  6. return arr;
 下面,我们写出完整代码:
  1. int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
  2. int prefix[100000];
  3. prefix[0] = 1;
  4. int suffix[100000];
  5. suffix[numsSize - 1] = 1;
  6. int* arr = (int*)malloc(numsSize * sizeof(int));
  7. int i;
  8. for (i = 0; i < numsSize; i++)
  9. {
  10. prefix[i + 1] = prefix[i] * nums[i];
  11. }
  12. for (i = 1; i < numsSize; i++)
  13. {
  14. suffix[numsSize - i - 1] = suffix[numsSize - i] * nums[numsSize - i];
  15. }
  16. for (i = 0; i < numsSize; i++)
  17. {
  18. arr[i] = prefix[i] * suffix[i];
  19. }
  20. *returnSize = numsSize;
  21. return arr;
  22. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/818378
推荐阅读
相关标签
  

闽ICP备14008679号