某互联网公司一年一度的春招开始了,一共有 n
名面试者入选。每名面试者都会提交一份简历,公司会根据提供的简历资料产生一个预估的能力值,数值越大代表越有可能通过面试。
小 A 和小 B 负责审核面试者,他们均有所有面试者的简历,并且将各自根据面试者能力值从大到小的顺序浏览。由于简历事先被打乱过,能力值相同的简历的出现顺序是从它们的全排列中等可能地取一个。现在给定 n
名面试者的能力值 scores
,设 X
代表小 A 和小 B 的浏览顺序中出现在同一位置的简历数,求 X
的期望。
提示:离散的非负随机变量的期望计算公式为 。在本题中,由于 X
的取值为 0 到 n
之间,期望计算公式可以是 。
示例 1:
输入:
scores = [1,2,3]
输出:
3
解释:由于面试者能力值互不相同,小 A 和小 B 的浏览顺序一定是相同的。
X
的期望是 3 。
示例 2:
输入:
scores = [1,1]
输出:
1
解释:设两位面试者的编号为 0, 1。由于他们的能力值都是 1,小 A 和小 B 的浏览顺序都为从全排列
[[0,1],[1,0]]
中等可能地取一个。如果小 A 和小 B 的浏览顺序都是[0,1]
或者[1,0]
,那么出现在同一位置的简历数为 2 ,否则是 0 。所以X
的期望是 (2+0+2+0) * 1/4 = 1
示例 3:
输入:
scores = [1,1,2]
输出:
2
限制:
1 <= scores.length <= 10^5
0 <= scores[i] <= 10^6
代码和我的初步思考&注释如下
class Solution {
public:
int expectNumber(vector<int>& scores) {
//首先排序,冒泡吧
// for(int i=0;i<scores.size()-1;++i){
// for(int j=0;j<scores.size()-1-i;j++){
// if(scores[j]>scores[j+1]){
// int tmp=scores[j];
// scores[j]=scores[j+1];
// scores[j+1]=tmp;
// }
// }
// }结果正确,但是过不了因为超出了时间限制,乖乖用库函数吧
sort(scores.begin(),scores.end());
//排序完成,接下来去重
//scores.erase( unique(scores.begin(),scores.end()) , scores.end() );
//return scores.size();//用这上下俩句的写法也是对的,这两句和下面一个return的效果是一样的
return unique(scores.begin(),scores.end())-scores.begin();
}
};
如果第一次做这道题,理解力像我一样差,可能会看的很懵,不是要求“出现在同一位置的简历数的期望”吗?这代码为什么是去重操作的?
首先建立这样一个模型,一个数组,能力值有13579,重复的表示几份简历的能力值一样,数组[9,9,9,9,9,7,5,5,3,1]共10个.
先明确小a小b看的那个位置是随机的,也就是1/10的等概率,最终结果期望是每一份简历非稳定性排序后留在原地的期望值*1/10再求和(注意不是同一能力值的所有简历,而是单单一份简历)
首先看能力为1的sfw的简历,就他一个站在他的位置上,无论在从小到大如何进行打算顺序的非稳定性排序,1都在他自己的位置,雷打不动
为什么我要强调非稳定性,因为这里出现情况不同的原因就是一种稳定性的原理,能力值相同的多份简历,每份简历上的人是各不相同的,还存在除了能力值外的另一隐形变量来区分这些简历,而非稳定性打乱顺序后的一种能力值多份简历的所有其实就是这些相同能力值的简历的全排列
所以能力值为1的所有人(这里仅仅一个)的期望为1。
然后看能力为3的简历,同1,期望为1。
然后看能力为5的简历,这里开始就有意思了
把能力为5的两份简历单拿出来作为一个长度为2的数组,全排列一共两种,[51,52]和[52,51] ( [第一份简历位置,第二份简历位置] )
然后小a小b去随机拿,共四种情况因为太简单就不列表了,二人在第一个位置或第二个位置简历相同的概率均为1/2,两个元素是这样
记得如何求期望吧,概率*结果,具体到这里概率就是刚才的1/2,结果是什么?还在原地的话结果为true为1,不在原地结果为false为0
(别忘了现在是单拿出了能力值为5的简历做的大小为2的数组)那第一个位置的期望就是1*1/2,第二个位置的期望也是1/2
那么能力值为5的所有简历的期望就是1/2+1/2=1了,看看是不是很熟,和能力值为1,3只有一份简历的是一样的
那如果是能力值相同的n个元素呢,每一个元素随机排序后还在原位的概率为1/n,直观理解就是在n个位置随机选择一个位置落下这个元素
那单个元素的期望就是 1*1/n + 0*(n-1)/n,由对称知每个元素的期望相同
那n个元素的期望就是n*( 1*1/n + 0*(n-1)/n ) 也就是1
也就是有着同一能力值的所有简历的期望和为1
这也符合上面通过1,3,5实例得到的规律
所以现在就变成给scores数组去重,目标期望就是去重后的元素个数
难点不在去重,而在推导出「同一能力值期望和为1」这个小结论来实现对解题的简化