leetcode——除自身以外陣列的乘積
阿新 • • 發佈:2021-01-29
題目:給你一個長度為n的整數陣列nums,其中n > 1,返回輸出陣列output,其中 output[i]等於nums中除nums[i]之外其餘各元素的乘積。
說明:
- 題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內
- 請不要使用除法,且在O(n) 時間複雜度內完成此題。
示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]
方案一:除法
用到除法,就要檢驗除數是否為0
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int len = nums.size(); int mul = 1; int zero_num = 0; for (int i = 0; i < len; i++) { if (nums[i] == 0) { zero_num++; continue; } mul *= nums[i]; } vector<int> output = vector<int>(len); for (int i = 0; i < len; i++) { if (zero_num == 1) { if (nums[i] != 0) { output[i] = 0; } else { output[i] = mul; } } else if (zero_num > 1) { output[i] = 0; } else { output[i] = mul / nums[i]; } } return output; } };
時間複雜度
空間複雜度答案陣列,不算在空間複雜度內
方案二:左右乘積列表
陣列L: L[i]為nums[i] 左側所有元素乘積,其中L[0]=1
陣列R:R[i]為nums[i] 右側所有元素乘積,其中R[len - 1]=1
輸出陣列output[i] = L[i] * R[i]
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int len = nums.size(); vector<int> left = vector<int>(len); vector<int> right = vector<int>(len); vector<int> output = vector<int>(len); left[0] = 1; for (int i = 1; i < len; i++) { left[i] = left[i - 1] * nums[i - 1]; } right[len - 1] = 1; for (int i = len - 2; i >= 0; i--) { right[i] = right[i + 1] * nums[i + 1]; } for (int i = 0; i < len; i++) { output[i] = left[i] * right[i]; } return output; } };
時間複雜度
空間複雜度
方案三:方案二優化,空間複雜度O(1)
省略L陣列空間,用output儲存L陣列。
然後動態計算R陣列的值。
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int len = nums.size(); vector<int> output = vector<int>(len); output[0] = 1; for (int i = 1; i < len; i++) { output[i] = output[i - 1] * nums[i - 1]; } int right = 1; output[len - 1] *= right; for (int i = len - 2; i >= 0; i--) { right *= nums[i + 1]; output[i] *= right; } return output; } };
時間複雜度
空間複雜度