JavaScript:leetcode_238. 除自身以外數組的乘積(左右乘積列表)

題目說明


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

 

示例:

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

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

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

解題思路一(左右乘積列表)

  1. 如果可以用除法,那我們只需要求出列表乘積,然後除以nums[i]就是所求值了。
  2. 不用除法的情況下,我們需要求得nums[i]的左側乘積L,和右側乘積R,然後L*R求得目標值
  3. 那麼我們創建兩個乘積列表L,RL[i]代表從nums中從0 ~ i的乘積,R[i]代表nums中從i ~ nums.length - 1的乘積。
  4. 那麼我們所求的output[i]就變成了L[I-1] * R[i+1];

代碼實現一

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    if (nums.length <= 2) {
        return nums.reverse();
    }
    let L = [nums[0]]
    let R = new Array(nums.length);
    R[nums.length-1] = nums[nums.length-1];
    for(let i = 1, j = nums.length - 2; i < nums.length; i++, j--) {
        L[i] = L[i-1] * nums[i];
        R[j] = R[j + 1] * nums[j];
    }
    for(let i = 1; i < nums.length - 1; i++) {
        nums[i] = L[i-1] * R[i + 1]; 
    }
    nums[0] = R[1];
    nums[nums.length-1] = L[nums.length-2];
    return nums;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章