Try   HackMD

382.Linked List Random Node

tags: Medium,Linked List,Math

382. Linked List Random Node

題目描述

Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen.

Implement the Solution class:

  • Solution(ListNode head) Initializes the object with the head of the singly-linked list head.
  • int getRandom() Chooses a node randomly from the list and returns its value. All the nodes of the list should be equally likely to be chosen.

範例

Example 1:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Input
["Solution", "getRandom", "getRandom", "getRandom", "getRandom", "getRandom"]
[[[1, 2, 3]], [], [], [], [], []]
Output
[null, 1, 3, 2, 2, 3]

Explanation
Solution solution = new Solution([1, 2, 3]);
solution.getRandom(); // return 1
solution.getRandom(); // return 3
solution.getRandom(); // return 2
solution.getRandom(); // return 2
solution.getRandom(); // return 3
// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.

Constraints:

  • The number of nodes in the linked list will be in the range [1, 104].
  • -104 <= Node.val <= 104
  • At most 104 calls will be made to getRandom.

Follow up:

  • What if the linked list is extremely large and its length is unknown to you?
  • Could you solve this efficiently without using extra space?

解答

C++

思路:

第一種: 先遍歷一次得整體數量n再以此為區間隨機取得數字
第二種: 對於無法先遍歷得整體數量n如streaming data需用Reservoir sampling

class Solution { public: ListNode *head; Solution(ListNode* head) { this->head = head; } int getRandom() { int n = 1, res = 0; ListNode* cur = head; while(cur) { int j = rand() % n; if(j == 0) res = cur->val; n++; cur = cur->next; } return res; } };

Time:

O(n)
Extra Space:
O(1)

XD March 10, 2023

Follow up:

  1. 如果選取k個如何做?
  2. 如果有m台機器做分散式處理, 全部加總共n個, 選取k個如何做?

Reference

回到題目列表