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<len;i++) {
            left[i] = left[i-1]*nums[i-1];
        }
        for(int i =len-2;i>=0;i--) {
            right[i] = right[i+1]*nums[i+1];
        }
        for(int i =0;i<len;i++) {
            result[i] = left[i]*right[i];
        }
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章