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 が変わるのでキャッシュを一から作成し直しているが、他の人の回答を参照したところ、既存のキャッシュを活かす方法もあるようだ。今後、この方法でも実装してみる。