diff --git a/tree/random-pick-with-weight/answer.md b/tree/random-pick-with-weight/answer.md new file mode 100644 index 0000000..b28b967 --- /dev/null +++ b/tree/random-pick-with-weight/answer.md @@ -0,0 +1,264 @@ +# 528. Random Pick with Weight + +* 703. Kth Larget Element in a Streamの関連問題がDiscordにあったので、 + Arai60の途中で解いてみました。 + +## STEP1 + +* 発想 + * 重み付きの確率を行う方法。 + * `w_0`, `w_1`, `w_2`, ...をsumで割り算し`w_0`/sum, `w_1`/sum, `w_2`/sum, ...とした後に、累積和をとる。 + 0から1のランダムな値がどの重みに属するかを調べることで、重みを考慮したサンプリングできそう。 + +* 詰まったところ + * `for (const i in w)` というfor in 文を使った際に、iにstringが帰ってくることを忘れており、 + numberを返すべきところをstringで返してしまっていた。 + +### 線形探索を用いた方法 + +```javascript +const Solution = function(w) { + this.cum_sum_weights = [0] + let sum = 0 + for (const weight_i of w) { + sum += weight_i + } + for (let i=0; i