【力扣时间】【382】【中等】链表随机节点

周日来了题中等的。
行吧,来者不拒。

1、先看题

在这

首先这题我是每太看懂的,但题目加粗标明了要求每个节点被选中的概率一样,所以就觉得大概是和数学相关的题了。

2、思路

关于链表的使用应该是很基础的内容,大学如果学了计算机的话,《数据结构》这门课是一定会讲到的。

于是重点就在于如何让每次选中的节点概率一样了。
然鹅,数学题我是一概不会的,交给Random好了,毕竟只要我不加什么限制,在量级够大的情况下,随机就能让每个节点被选中的概率一致(大概吧 )。

总之,就是本着这种想法我就开动了。而至于节点的数量范围,不使用额外空间等要求,也很好办。

3、动手!

class Solution {

    private int length;

    private ListNode prev;

    private Random random;

    public Solution(ListNode head) {
        prev = head;
        length = 1;
        while (prev.next != null) {
            length++;
            prev = prev.next;
        }

        //让链表形成环状
        prev.next = head;

        random = new Random();
    }

    public int getRandom() {
        int move = random.nextInt(length);

        while (move > 0) {
            prev = prev.next;
            move--;
        }

        return prev.val;
    }
}

4、解读

是的!我选择了使用环状链表!
只要让链表最后一个节点的下一个节点(本应为null)指向链表的头节点,辣么这个链表就会形成环状链表。

然后再让一个指针不停在这个环状链表上移动,根据每次Random生成的随机数,并移动相同长度,再返回当前指向的节点的值即可。
这样,你甚至不用处理重新指回头部的情况。

至于这样的返回,能否保证选中每个节点的概率一致就……管他呢?

5、提交

在这里插入图片描述
额……我觉得这题力扣根本没法校验选中节点的概率是否一致,毕竟在完全随机的情况下,它没法根据我们的返回来做判断,更别提分析我们的代码了。

6、学习

直接来看大牛们好了,毕竟题目标签里的“水塘抽样”想必吸引你很久了。

嗯……果然看不懂。
你的朋友可能会背叛你,你的亲人可能会背叛你,但数学不会,数学不会就是不会。

这位大牛贴出了比官解更详细的水塘抽样讲解,供大家学习参考。

7、总结

啊……怎么周末又要过完了……
但总之,今天这道数学题还是有些含金量的,花些时间来消化消化吧。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值