【每日算法Day 4】除自身外数组的乘积:前/后缀和/积的妙用

2020-06-04 数组

# 题目链接

LeetCode 238. 除自身外数组的乘积 (opens new window)

# 题目描述

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。

# 示例

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

# 解题思路

记得之前做一道题目的时候为了避免额外的O(n)空间用到了前缀和,然而做这题的时候开始思想太僵只想到前缀积,没想到还有后缀积这种东西,一个元素的前缀积乘后缀积就是要求的结果。一遍从左向右遍历得到前缀积存在等长数组中,第二遍从右向左遍历得到后缀积直接乘以前缀积就能得到答案。

public int[] productExceptSelf(int[] nums) {
    int[] result=new int[nums.length];
    int k=1;
    for (int i = 0; i < nums.length; i++) {
        result[i]=k;//k临时存储当前前缀积并存在result[i]中
        k*=nums[i];
    }
    k=1;
    for (int i = nums.length - 1; i >= 0; i--) {
        result[i]*=k;//这里是已有的前缀积乘以当前后缀积k
        k*=nums[i];
    }
    return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
上次更新: 2020/6/12 23:05:46