除自身以外的乘積陣列(力扣第238題)

2022-06-16 11:42:11 字數 1503 閱讀 7586

題目

給你乙個長度為 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個開始求單側因子乘積

**如下:

public

int 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 時間複雜度內完成此題。高階 你可以...