ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

16 除了自身以外数组的乘积

16 除了自身以外数组的乘积

给你一个整数数组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等技术内容,点击立即学习:链接

返回列表