題目
給你乙個長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。
示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]
提示:題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內。
說明: 請不要使用除法,且在 o(n) 時間複雜度內完成此題。
分析:
不能使用除法,而且時間複雜度是o(n) ,那麼暴力迴圈就不能使用了。所以就要通過發現規律進行解決了。假設乙個陣列的元素為m0,m2,m3,……,mn-1 ,按照題意,結果陣列中:
num0 = m1 * m2 * m3 * ……mn-1
num1 = m0 * m2 * m3 * ……mn-1
num2 = m0 * m1 * m3 * ……mn-1
num3 = m0 * m1 * m2 * ……mn-1
……numn-1 = m0 * m2 * m3 * ……mn-2
通過觀察以上的式子,會發現結果陣列中,它的每個結果都是由兩部分乘積組成的:
比如第i個結果,它對應了原始陣列中除了第i個數以外其他所有數的乘積,
這個結果的乘積因子都是原始陣列中除第i個數以外的元素,那麼可以分為兩個部分,即一部分因子在原始陣列中位於第i個數的前面,另一部分位於第i個數的後面
那麼這些我們在求結果陣列中的每乙個數的時候,就可以考慮分成兩步求:
第一步求位於第i個數左邊的因子乘積,這個可以通過向左遍歷原始陣列,然後累乘求出第i個數的左邊所有數的乘積;
第二步求位於第i個數右邊的因子乘積,這個可以通過向右遍歷原始陣列,然後累乘求出第i個數的右邊所有數的乘積
而對於第0個數和第n-1個數,它們都只有單側的因子乘積,那麼我們向左遍歷完,就能求出結果陣列最後乙個元素的結果,向右遍歷完,也可以求出結果陣列中的第乙個結果,但是注意,結果陣列初始化時,要將第乙個值初始化為1,
否則會求出0這個結果;
我們定義乙個結果陣列,兩個累乘變數即
left_product和right_product,分別表示求左邊因子乘積時的累乘結果,和求右邊乘積時的累乘結果。因為首尾兩個數都只有單側因子,所以我們分別從第1個和第n-2個開始求單側因子乘積
**如下:
publicint productexceptself(int
nums)
int left_product = 1;
res[0] = 1;
for (int i = 1; i < n; i++)
int right_product = 1;
for (int i = n-2; i >=0 ; i--)
return
res;
}
除自身以外陣列的乘積
目錄 1 題目描述 2 題目分析 3 實現 給定長度為 n 的整數陣列nums,其中 n 1,返回輸出陣列output,其中output i 等於nums中除nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成...
除自身以外陣列的乘積
給定長度為 n 的整數陣列nums,其中 n 1,返回輸出陣列output,其中output i 等於nums中除nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。高階 你可以在常數空間複雜度內完成這個...
除自身以外陣列的乘積
提交 總結給你乙個長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。高階 你可以...