238. 除自身以外数组的乘积

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

solution:

 1 class Solution {
 2 public:
 3     vector<int> productExceptSelf(vector<int>& nums) {
 4         int size = nums.size();
 5         vector<int> left;left.resize(size);
 6         vector<int> right;right.resize(size);
 7         left[0] = 1;
 8         for(int i = 1;i<size;i++)
 9         {
10             left[i] = left[i - 1] * nums[i-1];
11         }
12         right[size-1] = 1;
13         for(int i = size- 2;i>=0;i--)
14         {
15             right[i] = right[i + 1] * nums[i + 1];
16         }
17         for(int i = 0;i<size;i++)
18         {
19             left[i]*=right[i];
20         }
21         return left;
22     }
23 };

思考:对于任意位置上的num[i]而言,它在output对应的结果应该是0~i-1和i+1~nus.size()-1两个部分积的乘积,用两个数组分别继续i左右乘积,最后乘起来形成output

当然,大佬提供了只需要一个output数组的方法,但思路和上面没什么区别:

solution2:

 1 class Solution {
 2 public:
 3     vector<int> productExceptSelf(vector<int>& nums) {
 4         int size = nums.size();
 5         vector<int> output;output.resize(size);
 6         int left =1,right=1;
 7         for(int i = 0;i<size;i++)
 8         {
 9             output[i] = left;
10             left *= nums[i];
11         }
12         for(int i = size- 1;i>=0;i--)
13         {
14             output[i] *=right;
15             right*=nums[i];
16         }
17         return output;
18     }
19 };

最后:有人说这种题只是考奇技淫巧的,但是你要明白,“会就是会,不会就是不会”,一旦考到,笑到最后的会是我。

原文地址:https://www.cnblogs.com/Swetchine/p/11257118.html