每日一题《leetcode--382.链表随机结点》

https://leetcode.cn/problems/linked-list-random-node/


这道题我们首先看到题目中的要求:在单链表中随机选取一个链表中的结点,要使每个结点被选取的概率是一样的。

当我们看到随机这两个字时,应该就会想起rand()这个函数。接着我们把使用这个函数生成的随机值与链表的长度进行模运算,这样子求出的结果就不会大于链表长度。

复制代码
//用数组存储该链表
typedef struct {
    int* arr;
    int length;
} Solution;


Solution* solutionCreate(struct ListNode* head) {
    Solution* obj = (Solution*)malloc(sizeof(Solution));
    obj->length = 0;

    struct ListNode* Node = head;
    //记录链表长度
    while(Node)
    {
        ++obj->length;
        Node = Node->next;
    }

    obj->arr = (int*)malloc(sizeof(int) * obj->length);
    Node = head;
    //将链表节点中的值赋值给数组
    for(int i =0; i<obj->length;i++)
    {
        obj->arr[i] = Node->val;
        Node = Node->next;
    }

    return obj;
}

int solutionGetRandom(Solution* obj) {
    //rand生成的随机值 % 链表长度 的值不会大于链表长度
    return obj->arr[rand() % obj->length];
}

void solutionFree(Solution* obj) {
    free(obj->arr);
    free(obj);
}
相关推荐
Mr_Xuhhh2 分钟前
从理论到实践:深入理解算法的时间与空间复杂度
java·开发语言·算法
6Hzlia15 分钟前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
地平线开发者27 分钟前
智能驾驶感知算法的演进
算法·自动驾驶
爱丽_32 分钟前
B+ 树范围查询为什么快:页分裂/合并、索引设计与 SQL 写法优化
数据库·算法·哈希算法
WBluuue1 小时前
Codeforces 1087 Div2(ABCDEF)
c++·算法
Yzzz-F1 小时前
2025 ICPC武汉邀请赛 G [根号分治 容斥原理+DP]
算法
abant21 小时前
leetcode 114 二叉树变链表
算法·leetcode·链表
tankeven1 小时前
HJ165 小红的优惠券
c++·算法
先积累问题,再逐次解决2 小时前
快速幂优美算法
算法