剑指offer - 60.n个骰子的点数 | 61.扑克牌中的顺子

面试题60. n个骰子的点数(*)

题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

示例 1:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

示例 2:
输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778] 

解题思路:

class Solution {
public:
    vector<double> twoSum(int n) {
        vector<vector<int>>dp(n+1,vector<int>(6*n+1,0));
        double num=pow(6,n);
        vector<double>res(5*n+1,1/(double)6);
        //初始状态
        for(int i=1;i<=6;i++)dp[1][i]=1;
        for(int i=2;i<=n;i++){      //从2到n计算dp
            for(int j=i;j<=i*6;j++){  //表示当n=i时候的点数和取值从i到6i
                for(int k=1;k<=6;k++){  //dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]+dp[i-1][j-5]+dp[i-1][j-6];
                    if(j-k>0)dp[i][j]+=dp[i-1][j-k]; //第i个骰子点数一定比i-1个骰子点数大
                    if(i==n)res[j-i]=dp[i][j]/num;
              }
            }
        }        
        return res;
    }
};

面试题61. 扑克牌中的顺子

题目描述: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True
 
示例 2:
输入: [0,0,1,2,5]
输出: True

解题思路:必须满足两个条件:1.除0外没有重复的数;2.max-min<5;

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.empty()) return 0;
        int count[14]={0};//记录每个元素出现的次数;以numbers中的元素作为下标(最大K,对应13)
        int len=numbers.size();
        int max=-1;
        int min=14;
        for(int i=0;i<len;++i)
            {
            count[numbers[i]]++;
            if(numbers[i]==0) continue;
            if(count[numbers[i]]>1) return 0;
            if(numbers[i]>max) max=numbers[i];
            if(numbers[i]<min) min=numbers[i];
        }//end for
        if(max-min<5) return 1;
        return 0;
    }//end IsContinuous()
};

参考博客:https://blog.csdn.net/weixin_43956456/article/details/104732562

你可能感兴趣的:(剑指offer)