zoukankan      html  css  js  c++  java
  • LeetCode238. 除自身以外数组的乘积

    要求出某个数除自身以外的数组的乘积,就要求出这个数前面所有数的乘积和这个数后面的所有数的乘积。

    求出这个数前面或者后面所有数的乘积可以用前缀和或者后缀和对数组元素进行连续的乘积得到,但是由于这题限制了我们
    只能开一个数组(最后的返回数组),所以前缀和用了数组记录之后,后缀和不能再用数组了。

    不过没关系,前缀和已经记录了每个元素之前的所有元素的乘积,我们只要从后往前遍历的时候,用一个额外的变量suffix记录
    当前元素之后所有元素的乘积即可,每次更新了res数组之后,suffix *= nums[i],这样就更新了后缀和。

    从后往前遍历数组结束之后,res数组的每个位置的结果就是除nums[i]以外的其他所有元素的乘积。

    代码如下:

    class Solution {
    public:
        vector<int> productExceptSelf(vector<int>& nums) {
            int size = nums.size();
            vector<int> res(size);                  //res[i]表示nums[0...i-1]的乘积
            res[0] = 1;                             //0之前没有元素,res[0] = 1
            for(int i = 1; i < size; ++i) {            
                res[i] = res[i - 1] * nums[i - 1];      //nums[0...i-1]的乘积就是nums[0...i-2]的乘积再乘上nums[i-1]
            }
            int suffix = 1;                              //变量suffix记录当前元素之后的所有元素的乘积,初始为1
            for(int i = size - 1; i >= 0; --i) {
                res[i] *= suffix;                        //res[i]记录了当前元素之前的所有元素的乘积,suffix记录了当前元素之后的所有元素的乘积,二者相乘,就是除自身元素以外的所有元素的乘积
                suffix *= nums[i];                  //更新suffix
            }
            return res;
        }
    };
    
  • 相关阅读:
    【Linux软件安装】
    Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream
    Java IO(六) ObjectInputStream 和 ObjectOutputStream
    Java IO(四) InputStream 和 OutputStream
    Java IO(五)字节流 FileInputStream 和 FileOutputStream
    Java IO(三)FileDescriptor
    Java IO(二)File
    Java IO(一)概述
    Java中的集合(十五) Iterator 和 ListIterator、Enumeration
    Java中的自动装箱拆箱
  • 原文地址:https://www.cnblogs.com/linrj/p/13539910.html
Copyright © 2011-2022 走看看