LeetCode算法题:期望个数统计

第一题:简单 LCP11

题目描述

某互联网公司一年一度的春招开始了,一共有 n 名面试者入选。每名面试者都会提交一份简历,公司会根据提供的简历资料产生一个预估的能力值,数值越大代表越有可能通过面试。

小 A 和小 B 负责审核面试者,他们均有所有面试者的简历,并且将各自根据面试者能力值从大到小的顺序浏览。由于简历事先被打乱过,能力值相同的简历的出现顺序是从它们的全排列中等可能地取一个。现在给定 n 名面试者的能力值 scores,设 X 代表小 A 和小 B 的浏览顺序中出现在同一位置的简历数,求 X 的期望。

提示:离散的非负随机变量的期望计算公式为 在这里插入图片描述
在本题中,由于 X 的取值为 0 到 n 之间,期望计算公式可以是在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qi-wang-ge-shu-tong-ji
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

说实话,刚开始看到这个题,我连题目都没看懂,主要就是看到期望之后就懵逼了。然后看到题目下方的示例,结合自己百度了期望的概念之后才开始慢慢理解。实际上题目的意思就是在N个有序数据(从大到小)中,进行全排列,A和B分别是一种排列,问A和B这两种排列中相同的数据的个数的期望值是多少。
实际上难点就在重复数据因为如果数据是唯一的,那么这个数据的在排列中的位置就是固定的,对应的这个数据的期望就是1。那么重复数据的对应期望是多少呢?比如【2,1,1】中,这两个1的期望是多少?答案是1,我们可以把这两个1分别看做A和B,那么这两个数的排列就是:AB,BA。由于是有两个人来看,所以对应就有4中可能性,分别是:AB和AB,AB和BA,BA和AB,BA和BA,那么期望值就是(2+0+0+2)/4=1。然后根据期望的可加性,得出最后的结果为1+1=2。
这只是一种情况,如果数据不确定,那重复数据的期望是多少呢?结果还是1,为什么呢?可以参考leetcode官方的题解,我这里就不再说明了(主要是担心讲不明白)。
知道了重复数据的期望是1之后,那么最终想求的期望值就变成了唯一数据的期望值+重复数据的期望值=不同数据的个数。因为每一组重复的数据都是1个数字,有多少组重复的数据就有多少个数字。如:【1,2,2,3,5】对应的结果就是4,因为有4个不重复的数据;【1,2,3】对应的结果就是3,因为有3个不重复的数据;【1,1,2,3,3】对应的结果也是3,因为有3个不重复的数据。
今晚我在理解最后的期望值求法的时候,陷入了一个误区,就是如果有两组重复的数据,这两组重复的数据期望不是1吗?为什么会是2呢?后面我想明白了,因为这两组数据是互不干扰的。如果期望是1,那么代表,每组数据的位置是可以改变的,如:【1,1,…,3,3】是可以变成【1,3,…,1,3】的(中间的…表示位置不变的数据),但实际上数据是大小排好顺序的,所以这两组数据是互相独立的,那么期望值就是1+1=2。
最后,利用Set可以去重的特性就可以求出不同数据的个数了。

代码

public int expectNumber(int[] scores) {
        Set<Integer> set = new HashSet<>();
        for (int score:scores) {
            set.add(score);
        }
        return set.size();
    }

吐槽

刚开始做算法题,看题目就看了半天,后面实在想不出就去看解答,结果还是想了半天才弄明白。最后,写这篇文章,就这么一点字数,写了个把小时,太难了。一步一步来吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值