LeetCode 238 要求:給定長度 n > 1 的整數陣列 nums,構建輸出陣列 output 使 output[i] 等於除 nums[i] 外所有元素的乘積。不能使用除法,時間 O(n),進階要求 O(1) 額外空間(輸出陣列不算額外空間)。
output[i] = (nums[0]×...×nums[i-1]) × (nums[i+1]×...×nums[n-1])
定義兩個輔助陣列:
left[i] = nums[0] × ... × nums[i](含自身)right[i] = nums[i] × ... × nums[n-1](含自身)則 output[i] = left[i-1] × right[i+1](邊界單獨處理)。
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] left = new int[n], right = new int[n], ans = new int[n];
left[0] = nums[0];
for (int i = 1; i < n; ++i) left[i] = left[i-1] * nums[i];
right[n-1] = nums[n-1];
for (int i = n-2; i >= 0; --i) right[i] = right[i+1] * nums[i];
ans[0] = right[1];
ans[n-1] = left[n-2];
for (int i = 1; i < n-1; ++i) ans[i] = left[i-1] * right[i+1];
return ans;
}
用 ans 直接存儲 left,再反向累乘 right:
vectorproductExceptSelf(vector & nums) { int n = nums.size(); vector ans(n, 1); // 正向:ans[i] 存 nums[0]~nums[i-1] 的乘積 for (int i = 1; i < n; ++i) ans[i] = ans[i-1] * nums[i-1]; // 反向:用變量 right 累乘 nums[i+1]~nums[n-1] int right = 1; for (int i = n-1; i >= 0; --i) { ans[i] *= right; right *= nums[i]; } return ans; }
Input: [1, 2, 3, 4] left : [1, 1, 2, 6] // ans 正向後 right: [24,12,4,1] // 反向累乘變量 Output: [24, 12, 8, 6]
long long 或取模。