238 除自身以外陣列的乘積

2021-10-02 19:35:34 字數 1133 閱讀 2169

題目描述:

給定長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

示例:輸入: [1,2,3,4]

輸出: [24,12,8,6]

說明: 請不要使用除法,且在 o(n) 時間複雜度內完成此題。

高階:你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出陣列不被視為額外空間。)

解題思路:

1、「不能使用除法」意味著不能使用最簡單的兩次遍歷去解這個題,即第一次迴圈所有數累乘,第二次迴圈時每次除以相應位置的資料,求出返回陣列。有乙個好處是無形之中減少了乙個坑,即如果有乙個數是0的情況;

2、「o(n) 時間複雜度」排除了最基礎的暴力解法,即兩個for迴圈巢狀的形式;

3、需要知道除了nums[n]之外的所有數的乘積,即以nums[n]為分界線,之前的資料求出乙個累乘結果,之後的資料求出乙個累乘結果,兩個資料相乘即可;

4、對於nums[n]之後的資料累乘,我做了一次逆序遍歷,將後 numssize-(n+1) 個資料的累乘結果,存到陣列return_array[n+1]中,即 return_array[n] 中存的資料是 nums[n] * nums[n+1] * ...* nums[ numssize -1 ];

(我在這裡直接用了返回陣列來存這個逆序遍歷的資料,因為每個下標對應的資料都只會用一次,所以直接陣列復用,減少需要開闢空間的大小)

5、對於nums[n]之前的資料累乘,在順序遍歷的同時直接做就好了;

留下的疑問:

1、定義了乙個順序遍歷時累乘用到的int變數,返回陣列是返回大小的值+1,也就是說,除了返回陣列之外,不論輸入陣列長度為多少,用到的位元組數都為兩個int的位元組大小,算不算常數空間複雜度?

int* productexceptself(int* nums, int numssize, int* returnsize) 

for (int i = 0; i < numssize; i++)

*returnsize = numssize;

return return_array;

}

238 除自身以外陣列的乘積

題目描述 給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。解題思路 拿到題...

238 除自身以外陣列的乘積

給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 高階 你可以在常數空間複雜度內完成這個題目嗎?出於對空間複雜度分析的目的,輸出陣列不...

238 除自身以外陣列的乘積

給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。分析 如果引入乙個o n ...