Leetcode238. 除自身以外数组的乘积[Med] -JAVA

题目传送门

Leetcode238. 除自身以外数组的乘积[Med] -JAVA

  • 题目
  • 思路
  • 解法
    • 左右乘积列表

题目

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

示例:

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

提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

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

思路

本题目是想要我们将除自身以外的数相乘,那我们就可以把自己当前分界线,将我左边的数和右边的数乘起来,我们可以先将它算好,因此分成两组计算,把每个位置的左边,右边的数都乘起来,我们向一个方向计算,比如以自己当前位置为准,我把我左边的数乘了并存起来。
栗子:
[1, 2, 3, 4, 5, 6]
左:[1,2,6,24,20,30]
右:[720,360,120,30,1]
也就是第一个数比较special啦,因为他前面没有数,初始化第一个数为1,对后面的数相乘不会影响。而后面的数就都是将 靠当前左边的第一个数*靠当前索引左边的第一个数(已经算了靠自己最近之前的总乘积),右边也是同理.
当我们算好了左右乘积时,我们要计算某个值的除自身以外数组的乘积还难么?直接拿
left[i]*right[i] 就可以了。

解法

左右乘积列表

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] left = new int[len];
        int[] right = new int[len];
        int[] result = new int[len];
        left[0] = 1;
        right[len-1] = 1;
        for(int i =1;i=0;i--) {
            right[i] = right[i+1]*nums[i+1];
        }
        for(int i =0;i

你可能感兴趣的:(Leetcode,题解,-,JAVA)