力扣238题 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

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


示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

解题思路
本题要求提供一个数组,我们需要返回一个数组,数组中存储提供数组的除去当前下标位置的元素的剩余元素的乘积。

首先我们定义一个外层for循环,用来更新数组下标位置,从零开始;

在for循环中在嵌套两个并列的for循环,分别用来记录当前下标位置前面所有元素的乘积和当前下标位置后面所有元素的乘积;

然后if判断下标位置在哪里:

  • 如果下标位置为0,则将记录当前下标后面所有元素的乘积值存进定义的数组中;
  • 如果下标的位置为nums.length,则将记录当前下标前面所有元素的乘积值存进定义的数组中;
  • 如果下标位置在0和nums.length之间,则将两组乘积值乘到一起存进定义的数组中。

以此类推,直至外层for循环循环至nums最后,return定义的数组。

var productExceptSelf = function(nums) {
    let answer = [];
    for(let i = 0; i < nums.length; i++){
        let sumL = 1;
        let sumR = 1;
        let res = 0;
        for(let j = 0; j < i; j++){
            sumL = sumL*nums[j];
        };
        for(let m = i+1; m < nums.length; m++){
            sumR = sumR*nums[m];
        }
        // if(i == 0){
        //     res = sumR;
        // }else if(i == nums.length-1){
        //     res = sumL;
        // }else{
        //     res = sumL*sumR;
        // }
        res = sumL*sumR;
        answer.push(res);
    }
    return answer;
};

另一种思路:

每个位置的结果就是其前面所有元素的乘积和后面所有元素的乘积。

首先定义一个数组answer,从0开始遍历,将每个位置的元素的前面所有元素的乘积先存入数组answer中,遍历至最后出循环;

然后再从nums.length-1开始遍历,将每个位置后面所有元素的乘积与answer[当前位置]值相乘。

例如:

要求数组[1,2,3,4]

//从0开始遍历

第一次遍历answer值[1,1,2,6]

//从nums.length-1开始遍历

第二次遍历answer值[24,12,8,6]

var productExceptSelf = function(nums) {
    let answer = [];
    let k  = 1;
    for(let i = 0; i < nums.length; i++){
        answer[i] = k;
        k = k*nums[i];
    }
    let m = 1;
    for(let j = nums.length - 1; j >= 0; j--){
        answer[j] = answer[j]*m;
        m = m*nums[j];
    }
    return answer;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值