给你一个整数数组nums,返回 数组answer,其中answer[i]等于nums中除了nums[i]之外其余各元素的乘积 。
题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32 位整数范围内。
请不要使用除法,且在O(n)时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 105-30 <= nums[i] <= 30输入保证数组
answer[i]在32 位整数范围内
进阶:你可以在O(1)的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
思路
1、记录从左往右连续的乘积,l_nums[i]就等于前i个数的连续乘积(不包含nums[i])。
2、记录从右往左的连续乘积,r_nums[i]就等于后i个数的连续乘积(不包含nums[i])。
3、答案ans[i]=l_nums[i] * r_nums[i]。
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); if(n<2) return nums; vector<int> ans(n,1); vector<int> l_nums(n,1); vector<int> r_nums(n,1); int _temp=1; for(int i=1;i<n;i++){ l_nums[i]=_temp*nums[i-1]; _temp*=nums[i-1]; } _temp=1; for(int i=n-2;i>=0;i--){ r_nums[i]=_temp*nums[i+1]; _temp*=nums[i+1]; } for(int i=0;i<n;i++){ ans[i]=l_nums[i]*r_nums[i]; } return ans; } };推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接