技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

leetCode : Product of the Last K Numbers

leetCode の「Product of the Last K Numbers」を解いた。
https://leetcode.com/problems/product-of-the-last-k-numbers/

提出したコードは以下。工夫した点は、一度計算した結果(積)をキャッシュ (productCache) に追加して、getProduct の際にキャッシュにあれば、そこから値を使うところ。

import java.util.ArrayList;
import java.util.List;

class ProductOfNumbers {

    private List<Integer> numList = new ArrayList<>();
    private List<Integer> productCache = new ArrayList<>();

    public ProductOfNumbers() {
        // コンストラクタが受け取る情報(引数)はないので、ここでの初期化処理はない。
    }

    public void add(int num) {
        numList.add(num);

        // numListが変更されたら、キャッシュを一旦クリアする。
        productCache.clear();
    }

    public int getProduct(int k) {

        // ------------------------------------------------------------
        // キャッシュに欲しい積の情報がある場合は、キャッシュから返す。
        // ------------------------------------------------------------
        if (k <= productCache.size()) {
            return productCache.get(k - 1);
        }

        // ------------------------------------------------------------
        // キャッシュにない場合、積を計算しつつ、計算結果をキャッシュに積む。
        // ------------------------------------------------------------
        int product;
        if (productCache.isEmpty()) {
            product = 1;
        }
        else {
            product = productCache.get(productCache.size() - 1);
        }
        // キャッシュがないところから、計算を行う。
        int startIndex = (numList.size() - 1) - productCache.size();
        int endIndex = numList.size() - k;
        for (int i = startIndex; i >= endIndex; i--) {
            product *= numList.get(i);
            productCache.add(product);
            // 積が 0 になったら、それ以上、計算する必要なし。
            if (product == 0) {
                return 0;
            }
        }
        return product;
    }
}


提出結果は以下となった。

Runtime: 15 ms, faster than 56.07% of Java online submissions for Product of the Last K Numbers.
Memory Usage: 55.3 MB, less than 100.00% of Java online submissions for Product of the Last K Numbers.

提出者の中では、真ん中よりちょっと速いくらい。まあまあの出来。

なお、上記のコードでは、add されると list が変わるのでキャッシュを一から作成し直しているが、他の人の回答を参照したところ、既存のキャッシュを活かす方法もあるようだ。今後、この方法でも実装してみる。