一、题目描述:
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
二、思路分析:
方法一
分两次遍历
第一次遍历计算出当前元素之前乘积,并把结果保存在 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 春招闯关活动」, 点击查看 活动详情