Problem: 382. 链表随机节点
文章目录
- 题目描述
- 思路
- 复杂度
- Code
题目描述
思路
由水塘抽样易得,当遇到i个元素,有 1 / i 1/i 1/i的概率选择该元素;则在实际操作中我们定义一个下标i从1开始遍历每次判断rand() % i == 0(该操作就是判断概率是否为 1 / i 1/i 1/i);若成立则将该节点值返回
复杂度
时间复杂度:
O ( n ) O(n) O(n);其中 n n n为链表的长度
空间复杂度:
O ( 1 ) O(1) O(1)
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
ListNode *head;
public:
Solution(ListNode* head) {
this -> head = head;
}
/**
* Returns a random node of the linked list
*
* @return int
*/
int getRandom() {
int res = 0;
ListNode* node = head;
int i;
for (int i = 1; node != nullptr; ++i) {
if (rand() % i == 0) {
res = node -> val;
}
node = node -> next;
}
return res;
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(head);
* int param_1 = obj->getRandom();
*/