亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何構建乘積數組

發布時間:2021-12-15 13:51:09 來源:億速云 閱讀:115 作者:小新 欄目:大數據

小編給大家分享一下LeetCode如何構建乘積數組,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

題目描述

給定一個數組 A[0,1,…,n-1],請構建一個數組 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。

  • 所有元素乘積之和不會溢出 32 位整數
  • a.length <= 100000

題目樣例

示例

  • 輸入: [1,2,3,4,5]
  • 輸出: [120,60,40,30,24]

題目思考

  1. 如何做到 O(N)時間復雜度?

解決方案

思路
  • 一個比較容易想到的思路是暴力法, 對每個元素都計算其左右乘積, 這樣時間復雜度達到了 O(N^2), 按照題目數據規模肯定會超時
  • 還有種方法是求所有元素的總乘積, 然后對于每個元素分別除以自身 (注意對 0 的處理), 這樣雖然只用了 O(N)時間, 但不滿足題目要求
  • 那如何做到 O(N)時間復雜度且不使用除法呢? 我們如果能夠在計算某個元素時利用到之前的計算結果, 那么就不需要重復計算當前的左右所有乘積了
  • 比較容易想到的思路就是類似前綴和的預處理方案, 只是這里改成了                           前綴積, 具體步驟如下:
    1. 從左到右遍歷一遍數組, 記錄當前前綴積并保存到數組中
    2. 然后再從右向左遍歷, 記錄當前后綴積, 然后與前一個前綴積相乘, 即為當前元素的左右所有元素乘積了
  • 下面的代碼對必要步驟有詳細的解釋, 方便大家理解
復雜度
  • 時間復雜度 O(N): 只需要遍歷數組兩次
  • 空間復雜度 O(N): 需要維護一個前綴積數組
代碼
class Solution:
    def constructArr(self, a: List[int]) -> List[int]:
        # 從左到右, 再從右向左遍歷
        # 維護前綴積數組, 從右向左遍歷時只需要維護后綴積即可, 然后乘以前一個前綴積, 其結果即為當前元素的左右元素乘積
        lefts = []
        left = 1
        for x in a:
            left *= x
            lefts.append(left)
        # 這里只需要維護后綴積, 沒必要再建立一個后綴積數組
        right = 1
        res = [0] * len(a)
        for i in range(len(a))[::-1]:
            # 注意下標為0時左側沒有元素, 此時左側部分乘積置為1
            left = lefts[i - 1] if i > 0 else 1
            res[i] = left * right
            # 注意當前元素處理完之后再乘以它, 因為結果是不包含當前元素自身的
            right *= a[i]
        return res

以上是“LeetCode如何構建乘積數組”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

互助| 正镶白旗| 海丰县| 灵寿县| 临城县| 武乡县| 开原市| 保靖县| 沂源县| 建湖县| 交城县| 仁怀市| 青阳县| 台山市| 凤阳县| 桃园县| 沈阳市| 社旗县| 乌苏市| 恩平市| 江阴市| 吉安市| 竹溪县| 仪陇县| 云林县| 乌拉特前旗| 绥棱县| 奉节县| 泸定县| 佳木斯市| 手机| 秭归县| 江门市| 介休市| 乐昌市| 阳城县| 额敏县| 屯留县| 池州市| 类乌齐县| 晋宁县|