1. 程式人生 > 其它 >Leetcode 238. 除自身以外陣列的乘積 中等 陣列

Leetcode 238. 除自身以外陣列的乘積 中等 陣列

238. 除自身以外陣列的乘積

題目

給你一個整數陣列 nums,返回 陣列 answer ,其中 answer[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積 。

題目資料 保證 陣列 nums之中任意元素的全部字首元素和字尾的乘積都在  32 位 整數範圍內。

請不要使用除法,且在 O(n) 時間複雜度內完成此題。

示例 1:

輸入: nums = [1,2,3,4]
輸出: [24,12,8,6]

思路1:

使用L記錄i左側數的乘積,L[0]=0,R記錄右側的乘積,ret[i]=L[i]*R[i]

時間和空間複雜度都為O(n)

class Solution {
public
: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); vector<int> L(n); vector<int> R(n); L[0]=1; for(int i=1;i<n;++i) L[i]=L[i-1]*nums[i-1]; R[n-1]=1; for(int i=n-2;i>=0;--i) R[i]
=R[i+1]*nums[i+1]; vector<int> answer(n); for(int i=0;i<n;++i) answer[i]=L[i]*R[i]; return answer; } };

 

思路2:

使用answer用作記錄L,然後用一個引數R記錄R,先走一遍L流程,

然後走R流程時直接用answer*R,同時R*=nums[i]

這樣空間複雜度O(1)

class Solution {
public:
    vector<int> productExceptSelf(vector<int
>& nums) { int n=nums.size(); vector<int> answer(n); answer[0]=1; for(int i=1;i<n;++i) answer[i]=answer[i-1]*nums[i-1]; int R=1; for(int i=n-1;i>=0;--i){ answer[i]=answer[i]*R; R*=nums[i]; } return answer; } };