• 238. Product of Array Except Self


    问题:

    给定数组,求除本位数字以外所有数字之乘积的新数组

    Example:
    Input:  [1,2,3,4]
    Output: [24,12,8,6]
    Constraint: It's guaranteed that the product of the elements of any prefix or suffix of the array (including the whole array) fits in a 32 bit integer.
    Note: Please solve it without division and in O(n).
    

      

    解法:

    例如,给定下图数组 [4, 5, 1, 8, 2, 10, 6]

    那么先从左向右轮询乘积一轮:

    如下图红色区域:

    res[i]=res[i-1]*nums[i-1];

    第一行:无红色区域:res[0]=1

    第二行:红色区域=4  res[1]=res[0]*nums[0]=1*4

    第三行:红色区域=4*5 res[2]=res[1]*nums[1]=1*4*nums[1]=1*4*5

    第四行:红色区域=4*5*1 res[3]=res[2]*nums[2]=1*4*5*nums[2]=1*4*5*1

    。。。。。。

    然后从右往左,同理乘积一轮:

    但此时res已经被上一轮乘积占用,只能使用新变量R来记录 从右往左的累计乘积。

    如下图黄色区域:
    R*=nums[i+1];

    res[i]=R*res[i];

    最后一行:无黄色区域:R=1, res[6]=1*res[6]
    第六行:黄色区域=6:R=R*nums[6]=1*6, res[5]=R*res[5]=6*(4*5*1*8*2)(红色区域<上一轮的结果>)
    第五行:黄色区域=6*10:R=R*nums[5]=1*6*10, res[4]=R*res[4]=6*10*(4*5*1*8)(红色区域<上一轮的结果>)
    第四行:黄色区域=6*10*2:R=R*nums[4]=1*6*10*2, res[3]=R*res[3]=6*10*2*(4*5*1)(红色区域<上一轮的结果>)

    。。。。。。

    参考代码:

     1 class Solution {
     2 public:
     3     vector<int> productExceptSelf(vector<int>& nums) {
     4         vector<int> res(nums.size());
     5         res[0]=1;
     6         for(int i=1; i<nums.size(); i++){
     7             res[i]=nums[i-1]*res[i-1];
     8         }
     9         int R=nums[nums.size()-1];
    10         for(int i=nums.size()-2; i>=0; i--){
    11             res[i]=R*res[i];
    12             R*=nums[i];
    13         }
    14         return res;
    15     }
    16 };
  • 相关阅读:
    tcp的三次握手和四次挥手
    前端文档规范
    阻止事件冒泡
    研发纠纷解决方案
    ui-router 中views的配置
    JXL操作Excel部分详解(java)
    utf-8与utf-16的区别
    把字符串转换为Double 类型
    spring MVC
    Android项目目录结构
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12636820.html
Copyright © 2020-2023  润新知