🐙

NeetCode 150 [Arrays & Hashing]:medium 4/6

2025/03/09に公開

NeetCodeのSolutionを書いていく

Products of Array Except Self

問題概要

整数の配列numsが与えられます。
整数の配列を返します。その整数はnums[i]以外の数字の累積です。
それぞれの積は32bitを超えないことが保証されます。

割り算を使わずにO(n)で解けますか?

配列数は2以上1000以下
整数は-20以上20以下

計算時間はO(n)、メモリーはO(n)を目指す。

Input: nums = [1,2,4,6]
Output: [48,24,12,8]

Input: nums = [-1,0,1,2,3]
Output: [0,-6,0,0,0]

メモ

問題を読みながら、全て掛け合わせておいて、自分自身で割った数を出そうと思っていたら。。。
問題の最後に「割り算を使わずに出来るか?」という記載が!
割り算を使わずにO(n)で処理を完了するには・・・?

わからんから答え見ちゃった。
前からの掛け算の結果(prefix)と、後ろからの掛け算(suffix)の結果をi番目の配列に保存しておいて、
配列i番目の結果はprefix[i-1] x suffix[i+1]で計算できる!
更にメモリ使用量をO(1)にできる解法も紹介されている。
とりあえずシンプルな方で実装してみた。

インデックスの指定がむずい!
理解できん・・・テストが通るまで色々試すという。知能不足🧠

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        res = [1] * len(nums)
        prefix = [1] * len(nums)
        suffix = [1] * len(nums)
        num = len(nums)

        for i in range(1, num, 1):
            prefix[i] = prefix[i - 1] * nums[i - 1]

        for i in range(num - 2, -1, -1):
            suffix[i] = suffix[i + 1] * nums[i + 1]

        for i in range(num):
            res[i] = prefix[i] * suffix[i]

        return res

Discussion