[题解]《算法零基础100讲》(第30讲) 概率与统计

一. 今天就不将概念了,直接上题

二. 题解

2.1 飞机座位分配概率

2.1.1 题目链接

1227. 飞机座位分配概率

2.1.2 思路分析:

  这道题我们可以通过分析计算得到这样一个公式:
在这里插入图片描述

推导过程

代码如下:

double nthPersonGetsNthSeat(int n){
    
    
    return n == 1 ? (double)1.0 : (double)0.5;
}

2.2 期望个数统计

2.2.1 题目链接

LCP 11. 期望个数统计

2.2.2 思路分析

  题目已经告诉了我们计算期望的公式,我们有期望的可加性也可以推导出:
在这里插入图片描述
由此我们可以发现,E(X)与数组的长度无关,至于数组中,不同数据的数量有关。

代码如下:

int expectNumber(int* scores, int scoresSize){
    
    
    int p[1000001] = {
    
     0 };
    int dif = 0;
    int max = 0;
    for(int i = 0; i < scoresSize; i++){
    
    
        p[scores[i]]++;
        if(max < scores[i]){
    
    
            max = scores[i];
        }
    }
    for(int i = 0; i <= max; i++){
    
    
        if(p[i]){
    
    
            dif++;
        }
    }
    return dif;
}

2.3 470. 用 Rand7() 实现 Rand10()

2.3.1 题目链接

470. 用 Rand7() 实现 Rand10()

2.3.2 思路分析

  题目以及给了rand7()函数,它可以随机生成1~7的数字,并且每个数字的出现概率相同,很明显,它是一个古典概率模型。
用rand7()构造rand10()

  1. 首先我们知道1~7中有四个奇数三个偶数,那我们拒绝7,在1 ~ 6中偶数和奇数出现的概率相同为0.5,现在我们拒绝6和7,只剩下1 ~ 5,每个数据出现的概率为0.2。
  2. 现在我们将上面两种得到的数据用两个变量保存first和second,当出现奇数时,我们返回second,偶数时我们返回second+5。

代码如下:

int rand10() {
    
    
    int first, second;
    while((first = rand7()) > 6);
    while((second = rand7()) > 5);
    return (first & 1) == 1 ? second : 5 + second;
}

三. 对应练习

1093. 大样本统计

剑指 Offer 60. n个骰子的点数

837. 新21点

1467. 两个盒子中球的颜色数相同的概率(困难)

猜你喜欢

转载自blog.csdn.net/qq_53060585/article/details/121431117