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;
        }
    };
    
  • 相关阅读:
    adb logcat 基本用法
    系统广播 android.intent.action.KILL_BACKGROUND_SERVICE
    eclipse android 不会自动生成R.java文件和包的解决办法
    android sdk 镜像点
    android ant 自动编译打包
    java spring 框架学习
    android机型排行榜(201509)
    转: Jenkins+Gradle实现android开发持续集成、打包
    android app多渠道分发打包
    转: 从微信的故障谈谈服务可用性
  • 原文地址:https://www.cnblogs.com/linrj/p/13539910.html
Copyright © 2011-2022 走看看