3. 每日一題算法:20200624-除自身以外數組的乘積

問題描述

給你一個長度爲 n 的整數數組 nums,其中 n > 1,返回輸出數組 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]

提示:題目數據保證數組之中任意元素的全部前綴元素和後綴(甚至是整個數組)的乘積都在 32 位整數範圍內。

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

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

解決方案

  • 因爲空間複雜度要求 O(1),不能使用 除法,因此一定需要在 乘法 過程中得到所有答案;
  • 我們可以將 res 數組列成乘積形式,不同的 n 組成每行內容,形成一個矩陣,可以發現矩陣 主對角線 全部爲 1 (當前數字不相乘,等價爲乘 1);
  • 因此,我們分別計算矩陣的 下三角上三角,並且在計算過程中儲存過程值,最終可以在遍歷 2nums 下完成結果計算。
res
res[0] = 1 num[1] num[n-2] num[n-1]
res[1] = num[0] 1 num[n-2] num[n-1]
num[n-2] num[n-1]
res[n-2] = num[0] num[1] 1 num[n-1]
res[n-1] = num[0] num[1] num[n-2] 1
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] res = new int[nums.length];
        int p = 1, q = 1;
        for (int i = 0; i < nums.length; i++) {
            res[i] = p;
            p *= nums[i];
        }
        for (int i = nums.length - 1; i > 0 ; i--) {
            q *= nums[i];
            res[i - 1] *= q;
        }
        return res;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章