题目
思路一 模拟
用vector把链表中所有数据存下来,再随机选取其中一个。
代码一
class Solution {
public:
vector<int> v;
Solution(ListNode* head) {
while(head){
v.push_back(head->val);
head=head->next;
}
}
int getRandom() {
return v[rand()%v.size()];
}
};
思路二 蓄水池抽样算法
抽取到第k个数据时,每个数据被选中的概率是1/k。不存储链表中所有节点的数据,而是遍历链表。当处理到节点 k 时,在 [0, k)范围内进行随机,若随机到结果为 0(发生概率为1/k),则将节点 k的值存入答案,最后一次覆盖答案的节点即为本次抽样结果。
代码二
class Solution {
public:
ListNode* head;
Solution(ListNode* _head) {
head=_head;
}
int getRandom() {
int ans=0,idx=0;
ListNode* t=head;
while(t && ++idx>=0){
if(rand()%idx==0) ans=t->val;
t=t->next;
}
return ans;
}
};