zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    STL--set_difference
    priority_queue和sort应用
    16进制转化8进制---map
    LeetCode62. 不同路径
    LeetCode209. 长度最小的子数组
    LeetCode第29场双周赛题解
    LeetCode61. 旋转链表
    LeetCode60. 第k个排列
    LeetCode59. 螺旋矩阵 II
    LeetCode58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12636820.html
Copyright © 2011-2022 走看看