每日一题《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);
}
相关推荐
葵续浅笑8 分钟前
LeetCode - 杨辉三角 / 二叉树的最大深度
java·数据结构·算法·leetcode
qq_4798754326 分钟前
RVO和移动语义
前端·算法
菜小麒26 分钟前
推荐算法的八股文
算法·机器学习·推荐算法
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划
ada7_1 小时前
LeetCode(python)——49.字母异位词分组
java·python·leetcode
L_09071 小时前
【Algorithm】Day-11
c++·算法·leetcode
薛慕昭1 小时前
C语言核心技术深度解析:从内存管理到算法实现
c语言·开发语言·算法
.ZGR.2 小时前
第十六届蓝桥杯省赛 C 组——Java题解1(链表知识点)
java·算法·链表·蓝桥杯
近津薪荼2 小时前
每日一练 1(双指针)(单调性)
c++·算法
林太白2 小时前
八大数据结构
前端·后端·算法