当前位置: 首页 > article >正文

力扣382:链表随机结点

给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。

实现 Solution 类:

  • Solution(ListNode head) 使用整数数组初始化对象。
  • int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。

示例:

输入
["Solution", "getRandom", "getRandom", "getRandom", "getRandom", "getRandom"]
[[[1, 2, 3]], [], [], [], [], []]
输出
[null, 1, 3, 2, 2, 3]

思想:统计链表的长度,创建和链表一样大小的数组。将链表中的数据保存到数组中,利用数组的随机存储的特点,随机生成一个结点,然后访问数据即可。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */



typedef struct {
    int *data;
    int len;
    
} Solution;


Solution* solutionCreate(struct ListNode* head) {
    Solution *s = (Solution*)malloc(sizeof(Solution));
    s->len=0;
    struct ListNode *p=head;
    //统计链表的长度
    while(p!=NULL){
        p=p->next;
        s->len++;
    }
    //分配链表长度的数组空间
    s->data = (int*)malloc(sizeof(int)*s->len);
    p=head;
    //将链表的值存到数组中
    for(int i=0;i<s->len;i++){
        s->data[i]=p->val;
        p=p->next;
    }
    return s;
}

int solutionGetRandom(Solution* obj) {
    int num = rand()%obj->len;//创建[0,len)的随机数
    return obj->data[num];
}

void solutionFree(Solution* obj) {
    if(obj->data!=NULL){
        free(obj->data);
    }
    if(obj!=NULL){
        free(obj);
    }
}

/**
 * Your Solution struct will be instantiated and called as such:
 * Solution* obj = solutionCreate(head);
 * int param_1 = solutionGetRandom(obj);
 
 * solutionFree(obj);
*/

时间复杂度O(n);空间复杂度O(n)


http://www.kler.cn/news/363405.html

相关文章:

  • HCIP--1
  • 【YOLO模型】(1)--YOLO是什么
  • Ivanti云服务被攻击事件深度解析:安全策略构建与未来反思
  • FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持
  • 【代码随想录Day50】图论Part02
  • 基于单片机的电机测速系统设计
  • 计算广告第三版pdf
  • V2X介绍
  • 未来医疗:大语言模型如何改变临床实践、研究和教育|文献精析·24-10-23
  • Java毕业设计项目-ssm图书管理系统
  • 每日回顾:简单用C写 直接插入排序、希尔排序
  • 面试经典算法题63-只出现一次的数字
  • 使用json模块解析JSON数据
  • oracle和hive之间关于sql的语法差异及转换
  • 【C++进阶】之C++11的简单介绍(三)
  • 企业建立质量管理系统的目的是什么?
  • RHCE的练习(5)
  • vue3中使用element-plus的组件,编辑器检查警告爆红找不到名称相关的element组件
  • 软考中级网络工程师,快背,都是精华知识点!
  • 基于springboot美食商城推荐系统
  • flink使用hikariCP数据库连接池,导致连接泄露
  • 【JVM】—G1 GC日志详解
  • Spring Boot:植物健康监测的智能管家
  • 【JVM】—G1中的Young GC、Mixed GC、Full GC详解
  • [Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)
  • 【APIPost】学习与实践,如何使用 APIPost 测试 Java 后端项目