題目描述:
給定長度為 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 ...