Product of Array Except Self_Week5

来源:互联网 发布:严宽乔振宇 知乎 编辑:程序博客网 时间:2024/06/05 20:59

Product of Array Except Self_Week5

题目:(Product of Array Except Self) ←链接戳这里

题目说明:
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Solve it without division and in O(n).

For example, given [1,2,3,4], return [24,12,8,6].

难度: Medium

解题思路:
题目意为函数返回一个结果数组,第k个元素为原数组的除了第k个元素其本身的所有元素的乘积。这个问题本身很简单,遍历一遍数组得到所有元素的乘积,再挨个除以每个元素得到结果,复杂度为O(n),
但题目中有要求不得使用除法
这只能另外想办法了。

解题思路是这样的,新建两个数组,一个为mulFromBegin,一个为mulFromEnd。即遍历一次数组,mulFromBegin数组中的第k个元素,储存了原数组的第1个元素到第k-1个元素的乘积、反之亦然,mulFromEnd中储存原数组倒着的乘积。(将两个数组第一个元素都设置为1,特意让第k个元素是原数组第1个元素到第k-1个元素的乘积是为了去掉第k个数,满足题意。)
最后将两个数组的每一项都相乘,就得到结果。
若是不够明确,具体操作为:
例如想得到结果数组中的第3个数——即result[2],
mulFromBegin[2]将会是 1*nums[0]*nums[1]
mulFromEnd[2]将会是1*nums[n-1]nums[n-2]…*nums[3]
两者相乘即得到原数组nums所有元素(除了第3个元素)的乘积

#include <iostream>#include <vector>using namespace std;class Solution {public:    vector<int> productExceptSelf(vector<int>& nums) {        int i, size = nums.size();        vector<int> result(size);        /*下面两个数组表示原数组nums 分别从前和从后,累积的乘积,第一项都为常数1           假设 nums数组 中,有 a b c d 数字的话、mulFromBegin[1] = 1*a           mulFromBegin[2] = 1*a*b、mulFromBegin[3] = 1*a*b*c,没有第五项           同理 mulUpFromEnd[1] = d*1、 mulFromEnd[2] = 1*d*c         */         vector<int> mulFromBegin(size), mulFromEnd(size);        mulFromBegin[0] = 1;        mulFromEnd[0] = 1;        for (i = 1; i < size; i++) {            mulFromBegin[i] = mulFromBegin[i-1] * nums[i-1];            mulFromEnd[i] = mulFromEnd[i-1] * nums[size-i];        }         for (i = 0; i < size; i++) {            result[i] = mulFromBegin[i] * mulFromEnd[size-1-i];        }        return result;    }};
原创粉丝点击