目录标题
- 抽牌概率问题 (动态规划)
- 动态规划
- 题目分析
- 代码
- 洗衣机问题 (贪心)
- 题目
- 题目分析
抽牌概率问题 (动态规划)
动态规划
假设现在有1~N N张牌 每张牌的序号就代表着他的大小 (1 2 … N)
现在假设你从该牌组中等概率的抽出一张之后放回
当累加和小于a的时候 你将一直抽牌
当累加和大于等于a 小于等于b的时候你赢
当累加和大于b的时候你输
现在请你返回你能获胜的概率
题目分析
这是谷歌的一道面试题 实际上是一道非常简单的动态规划题目
我们只需要考虑三种条件即可
- 假设当前值大于等于a 小于等于b 我们只需要返回1.0即可
- 假设当前值大于b 我们只需要返回0即可
- 假设当前值小于a 则我们需要返回所有可能性的和除以N
只要想到这三种可能性 代码其实并不难写
关键在于如何想到
一是要多练 练多了这种题目基本上看一眼就知道要使用什么解法
二是根据题目找信息 题目中给出了三种范围 那么我们肯定可以很自然的想到这三种范围代表什么呢?
显然 可能性1 2 代表边界条件 3代表可能性 之后写出递归代码即可
代码
double process(int cur, int N, int a, int b) {
if (cur > b) {
return 0.0;
}
if (cur >= a || cur <= b) {
return 1.0;
}
double ans = 0;
for (int i = 1; i <= N; i++) {
ans += process(cur + i , N , a , b);
}
ans /= N;
return ans;
}
洗衣机问题 (贪心)
题目
本题为阿里面试题
题目为 有N台洗衣机 有 X件衣服在各个洗衣机内 现在要求洗衣机平分衣服
每台洗衣机内存放着的衣服不固定 现在可以从左到右移动 每次移动每台洗衣机可以将一件衣服向左或者向右移动
现在请问至少要移动多少轮才能让每个洗衣机平分衣服
题目分析
本题是典型的贪心 你见过就会 没见过就不会
它的思路其实跟动态规划的样本对应模型有些类似
都是找出一个特殊点 之后分析左右两测的可能性
比如说我们假设中间点为X 左边洗衣机总共多出了12件衣服 右边少了17件衣服
那么我们就需要至少17轮才能平分 (求最大值)
又比如 左边少了12件 右边也少了12件 这说明都集中在当前位置了 那么就需要12 + 12轮才能平分
之后我们从左到右遍历即可 这里的代码很简单就不给出了
这一题我们主要需要学习到一个从一个点到整体的思路