Leetcode 238. 除自身以外陣列的乘積 中等 陣列
阿新 • • 發佈:2022-03-17
題目
給你一個整數陣列 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; } };