238. 除自身以外数组的乘积|刷题打卡

442 阅读2分钟

一、题目描述:

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:

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

提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

二、思路分析:

方法一

avatar 分两次遍历
第一次遍历计算出当前元素之前乘积,并把结果保存在 list 中。就比如
当 i = 3 时, list[3] = 1 *2;
当 i = 4 时,list[4] = 1 * 2 * 3;
第二次遍历则是从后往前遍历,计算出当前元素之后的乘积,然后乘以list[i]. 举个例子:
当 i = 4时, list[4] = 1 * 2 *3, 然后 *1;
当 i = 3时, list[4] = 1 * 2 , 然后 *1 * 4;
当 i = 2时, list[4] = 1 , 然后 *1 * 4 * 3;
当 i = 1时, list[4] = 1 , 然后 *1 * 4 * 3 * 2;

方法二

就是暴力法,两个for循环十分简单,但是超出时间限制

三、AC 代码:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    let list = [], k = 1;
    for(let i = 0;i < nums.length;i++) {
        list[i] = k;
        k = nums[i] * k;
    }
    k = 1;
    for(let i = nums.length - 1;i >= 0;i--) {
        list[i] = list[i] * k;
        k = k * nums[i]
    }

    return list;
};
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
    /**
     * 思路:
     *  两个for循环计算, 第二for循环找到不是第一次for循环的值,并将它们挨个乘起来
     */
    let list = [];
    for(let i =0; i < nums.length;i++) {
        let num = 1;
        for(let j = 0; j < nums.length; j++) {
            if(i !== j) {
                num = num * nums[j]
            }
        }
        list.push(num);
    }
    return list;
};

四、总结:

第一种解题方法借鉴于 leetcode-cn.com/problems/pr…

刷题第四天,打工人加油!!!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情