lc アルゴリズム: ランダム チャプター

528. 重みによるランダムな選択.
正の整数配列 w が与えられ、w[i] が添え字 i の重みを表します (添え字は 0 から始まります)、ランダムに添え字 i を取得し、次の添字を選択できる関数 pickIndex を作成してください。ラベル i の確率は w[i] に比例します。
方法 1: プレフィックスの合計 + 二等分


470. Rand7() を使用して、平均 1 ~ 7 を生成する API に基づいてRand10() を実装し
、平均 1 ~ 10 を生成する API メソッドを実装します。 に基づく 2 次元行列の形式で拒否アルゴリズムを使用します。値は 2 回生成されます。

530. 配列のシャッフル 整数の
配列 num が与えられた場合、重複する要素を含まずに配列をシャッフルするアルゴリズムを設計します。
ソリューション クラスの実装:
Solution(int[] nums) 整数配列 nums を使用してオブジェクトを初期化します。
int[] replace() 配列を初期状態にリセットして返します。
int[] shuffle() 配列をランダムにシャッフルした結果を返します
。 最適化と削除のアイデア:Fisher-Yates
ここに画像の説明を挿入します
519. 行列をランダムに反転する
mxn のバイナリ行列が与えられ、すべての値が 0 に初期化されます。行列[i][j] == 0を満たす添え字(i, j)をランダムに選択し、その値を1に変更するアルゴリズムを設計してください。行列 [i][j] == 0 を満たすすべての添字 (i, j) は、同じ確率で選択される必要があります。
組み込みのランダム関数の呼び出しをできるだけ少なくし、時間と空間の複雑さを最適化するようにしてください。
Solution クラスを実装します。
Solution(int m, int n) バイナリ行列サイズ m および n でオブジェクトを初期化します。
int[] flick() 行列[i][j] == 0 となるようなランダムな添え字 [i,] を返します。 j] を実行し、対応するグリッドの値を 1 に変更します。
void replace() は、行列内のすべての値を 0 にリセットします。

法律:フィッシャー・イェーツが特別評決をメモ

497. 重なり合わない長方形内のランダムな点
重なり合わない軸に揃えられた長方形の配列長方形が与えられるとします。ここで、rects[i] = [ai, bi, xi, yi] は、(ai, bi) が i 番目の長方形であることを意味します。左下隅の点 (xi, yi) は、i 番目の長方形の右上隅の点です。特定の長方形で覆われた整数点をランダムに選択するアルゴリズムを設計します。長方形の周囲上の点も、長方形によって覆われているものとしてカウントされます。要件を満たすすべてのポイントは等しい確率で返される必要があります。
指定された四角形でカバーされる空間内の任意の整数点を返すことができます。

方法: 広い空間でランダムにサンプリングするか、すべてのポイントをシリアル化し、添え字へのランダム アクセスを通じてランダム アクセス ポイントの効果を実現します。この質問には 2 番目の方法を使用する方が便利です。ただし、配列が大きくなりすぎるため、すべての点を完全にシリアル化することはできません。より良い方法は、プレフィックス合計メソッドを使用して各行列の点に番号を付け、各行列の点番号が固定されるようにすることです。 x~y の連続した数値を取得し、配列の各要素を以前のすべての行列の点の数の合計として保存します。このステップは速度を上げるために 2 つに分割できます。点が配置されている行列を見つけたら、行列内の点の位置も確認する必要があります。このステップは非常に柔軟で、左下隅が最初の要素、右上隅が最後の要素で、行列内の要素には下から上 -> 左から右の順に番号が付けられます。したがって、この問題は解決されます。
(過剰なデータ量の問題を解決するためにプレフィックス合計を使用し、バイナリのインデックス要素の位置を使用します。ランダム読み取り O(1) には及ばないものの、十分なパフォーマンスが得られます。つまり、行列のポイント番号付けは、この問題を解決します)

710. ブラックリストの乱数は
シャッフルアルゴリズムと同じです。拒絶サンプリングを使用すると速度が低下します。この問題はマッピング法を使用します。ブラックリスト内のすべての番号を最後の連続番号に統合的にマッピングし、毎回ランダムに前のセグメントを選択してマップにそのセグメントが含まれているかどうかを判断し、含まれている場合はマップされたホワイトリスト番号を返します。これはサンプリングを完全に拒否します。

おすすめ

転載: blog.csdn.net/weixin_45719581/article/details/120115308