给定长度为 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 };
最后:有人说这种题只是考奇技淫巧的,但是你要明白,“会就是会,不会就是不会”,一旦考到,笑到最后的会是我。