<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)528:按權(quán)重隨機(jī)選擇

          共 2433字,需瀏覽 5分鐘

           ·

          2022-02-16 23:26

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做?按權(quán)重隨機(jī)選擇,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/random-pick-with-weight/

          You are given a 0-indexed array of positive integers w where w[i] describes the weight of the ith index.


          You need to implement the function pickIndex(), which randomly picks an index in the range [0, w.length - 1] (inclusive) and returns it. The probability of picking an index i is w[i] / sum(w).


          For example, if w = [1, 3], the probability of picking index 0 is 1 / (1 + 3) = 0.25 (i.e., 25%), and the probability of picking index 1 is 3 / (1 + 3) = 0.75 (i.e., 75%).


          給你一個(gè) 下標(biāo)從 0 開(kāi)始 的正整數(shù)數(shù)組 w ,其中 w[i] 代表第 i 個(gè)下標(biāo)的權(quán)重。

          請(qǐng)你實(shí)現(xiàn)一個(gè)函數(shù) pickIndex ,它可以 隨機(jī)地 從范圍 [0, w.length - 1] 內(nèi)(含 0 和 w.length - 1)選出并返回一個(gè)下標(biāo)。選取下標(biāo) i 的 概率 為 w[i] / sum(w) 。

          例如,對(duì)于 w = [1, 3],挑選下標(biāo) 0 的概率為 1 / (1 + 3) = 0.25 (即,25%),而選取下標(biāo) 1 的概率為 3 / (1 + 3) = 0.75(即,75%)。

          示例? ? ? ? ? ? ? ? ? ? ? ? ?

          示例 1

          輸入:
          ["Solution","pickIndex"]
          [[[1]],[]]
          輸出:
          [null,0]
          解釋?zhuān)?br mpa-from-tpl="t">Solution solution = new?Solution([1]);
          solution.pickIndex(); // 返回 0,因?yàn)閿?shù)組中只有一個(gè)元素,所以唯一的選擇是返回下標(biāo) 0。

          示例 2

          輸入:
          ["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
          [[[1,3]],[],[],[],[],[]]
          輸出:
          [null,1,1,1,1,0]
          解釋?zhuān)?br mpa-from-tpl="t">Solution solution = new?Solution([1, 3]);
          solution.pickIndex(); // 返回 1,返回下標(biāo) 1,返回該下標(biāo)概率為 3/4 。
          solution.pickIndex(); // 返回 1
          solution.pickIndex(); // 返回 1
          solution.pickIndex(); // 返回 1
          solution.pickIndex(); // 返回 0,返回下標(biāo) 0,返回該下標(biāo)概率為 1/4 。

          由于這是一個(gè)隨機(jī)問(wèn)題,允許多個(gè)答案,因此下列輸出都可以被認(rèn)為是正確的:
          [null,1,1,1,1,0]
          [null,1,1,1,1,1]
          [null,1,1,1,0,0]
          [null,1,1,1,0,1]
          [null,1,0,1,0,0]
          ......
          諸若此類(lèi)。


          解題

          https://www.cnblogs.com/linrj/p/13972905.html

          要按照概率隨機(jī)選擇一個(gè)數(shù),可以將數(shù)組的值看作一個(gè)區(qū)間上的長(zhǎng)度,比如題目給的例子,當(dāng)w = [1, 3]時(shí),我們可以假設(shè)有一個(gè)一維的區(qū)間,區(qū)間前1/4是第0個(gè)數(shù),區(qū)間的后3/4是第1個(gè)數(shù)。

          區(qū)間總長(zhǎng)度4也就是w數(shù)組所有數(shù)的和。

          我們可以在總長(zhǎng)度范圍(0~4)內(nèi)隨機(jī)選擇一個(gè)數(shù),假設(shè)這個(gè)數(shù)是0~1,那么就返回0,如果這個(gè)數(shù)是1~4,那么就返回1。
          這樣就解決了按照概率隨機(jī)返回的問(wèn)題。

          但是怎么判斷我們隨機(jī)選擇的數(shù)該返回什么值呢?
          這里需要用到前綴和,比如上面的例子w = [1, 3],我們可以得到前綴和preSum = [0, 1, 4](計(jì)算前綴和時(shí),一般前面要預(yù)留一個(gè)0,也就是w[0] + ... + w[i]的前綴和實(shí)際上是preSum[i + 1],這是有前綴和的計(jì)算公式?jīng)Q定的)。

          我們?cè)诳傞L(zhǎng)度范圍內(nèi)隨機(jī)取的數(shù)在區(qū)間內(nèi)處于哪一個(gè)前綴和的范圍內(nèi),就返回那個(gè)前綴和對(duì)應(yīng)的下標(biāo),比如我們?nèi)〉诫S機(jī)數(shù)oneRandNum = 2,那么在前綴和區(qū)間里第一個(gè)大于等于它的前綴和是下標(biāo)為2(在原數(shù)組中下標(biāo)為1)的前綴和4,這時(shí)我們需要返回前綴和為4的那個(gè)下標(biāo)2(在原數(shù)組中下標(biāo)為1),所以我們需要返回lower_bound(preSum.begin() + 1, preSum.end(), oneRandNum) - preSum.begin() - 1

          class?Solution?{
          public:
          ????vector<int> preSum;
          ????int?n;

          ????Solution(vector<int>& w) {
          ????????n = w.size();
          ????????preSum.resize(n + 1, 0);
          ????????for(int?i = 1; i <= n; ++i) {
          ????????????preSum[i] = preSum[i - 1] + w[i - 1];
          ????????}
          ????}
          ????
          ????int?pickIndex()?{
          ????????int?oneRandNum = rand() % preSum[n] + 1; // 取一個(gè)隨機(jī)數(shù),+1是為了將隨機(jī)數(shù)映射到范圍[1, 2, ... preSum[n]]內(nèi)
          ????????return?lower_bound(preSum.begin() + 1, preSum.end(), oneRandNum) - preSum.begin() - 1; // 找到第一個(gè)大于等于oneRandNum的前綴和在原數(shù)組中對(duì)應(yīng)的下標(biāo),就是答案
          ????}
          };



          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-520題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)521:最長(zhǎng)特殊序列 Ⅰ
          LeetCode刷題實(shí)戰(zhàn)522:最長(zhǎng)特殊序列 II
          LeetCode刷題實(shí)戰(zhàn)523:連續(xù)的子數(shù)組和
          LeetCode刷題實(shí)戰(zhàn)524:通過(guò)刪除字母匹配到字典里最長(zhǎng)單詞
          LeetCode刷題實(shí)戰(zhàn)525:連續(xù)數(shù)組
          LeetCode刷題實(shí)戰(zhàn)526:優(yōu)美的排列
          LeetCode刷題實(shí)戰(zhàn)527:?jiǎn)卧~縮寫(xiě)

          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色AAA毛片 | 久久久成人电影视频 | 日韩人妻丰满无码区A片 | 家庭乱伦_第1页_桃花影视 | 香蕉视频做爱 |