LeetCode——238.除自身以外数组的乘积

88 阅读2分钟

除自身以外数组的乘积

1.题目链接:

238. 除自身以外数组的乘积

2.原题描述:

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

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

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

3.相关算法

本题考察数组相关知识点,看完题目感觉思路很简单,于是就咔咔敲代码两层for循环,执行代码结果正确,提交却超时了,看了一下数据量10^5,思考了半天没想出更好的办法,观看官方题解,给出的一种很巧妙的方法,分别对左右数组分别乘积,再将左右数组相乘,刚好满足了除自身之外的数组相乘。

4.本题主要思路

先分别创建左右数组,再创建结果数组,初始化左数组,将第一个元素赋值为1,初始化右数组,将最后一个元素赋值为1,在使用for循环将左右数组分别乘以nums数组的值,最后结果数组分别等于左右数组的相应下标值相乘。

5.源码分析

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int length = nums.length;		// 1
        int[] l = new int[length];		// 2
        int[] r = new int[length]; 			
        int[] result = new int[length];		// 3
       
        l[0] = 1;				// 4
        r[length-1] = 1;
        
        for(int i = 1;i<length;++i){		// 5
            l[i] = nums[i-1]*l[i-1];
        }
        
        for(int i=length-2;i>=0;i--){		// 6
            r[i] = nums[i+1]*r[i+1];
        }
        
        for(int i = 0;i<length;++i){	`	// 7
            result[i] = l[i]*r[i];
        }
        
        return result;				// 8
    }
}
  1. 获取原数组的程度并创建变量,为后面创建数组和循环变量提供方便;
  2. 创建左右数组;
  3. 创建结果数组;
  4. 初始化左右数组;
  5. 将左数组的其他元素与nums数组相乘的到左乘积列表【从左往右】;
  6. 将右数组的其他元素与nums数组相乘的到右乘积列表【从右往左】;
  7. 将上面的到左右数组的乘积对应相乘的到结果数组;
  8. 返回结果数组。