日期 | 记录(更新题号) |
---|---|
2020年8月13日 | 292. Nim 游戏 1227. 飞机座位分配概率 |
2020年8月17日 | 1503. 所有蚂蚁掉下来前的最后一刻 319. 灯泡开关 |
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nim-game
找规律:
1–赢
2–赢
3–赢
4–输
5–赢
6–赢
7–赢
8–输
…
可以发现,如果是可以被4整除,就会输。
class Solution {
public boolean canWinNim(int n) {
return (n%4 != 0);
}
}
有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。
剩下的乘客将会:
如果他们自己的座位还空着,就坐到自己的座位上,
当他们自己的座位被占用时,随机选择其他座位
第 n 位乘客坐在自己的座位上的概率是多少?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/airplane-seat-assignment-probability
解法一:后面每一个人来了之后如果自己的座位上有人就把他赶走,所以2~n-1号就会对位入座。
1号就在1和n号之间以50的概率坐下。
PS:我随便坐,和我让你起来随便坐,概率是一样的哦。
https://leetcode-cn.com/problems/airplane-seat-assignment-probability/solution/1227-fei-ji-zuo-wei-fen-pei-gai-lu-by-yukarun/
解法二:数学推理,暂时劝退了。。。终究很久没看了。。。想起来几个月前我可是打算考研的人。。
有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。
当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。
而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。
给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-moment-before-all-ants-fall-out-of-a-plank
当两个蚂蚁相遇的时候,最后一个蚂蚁掉下去的时间,与两只蚂蚁是否改变方向无关。换言之,这是一个干扰选项。
class Solution {
public int getLastMoment(int n, int[] left, int[] right) {
int res = 0;
for(int i = 0; i < left.length; i++) {
res = Math.max(res, left[i]);
}
for(int i = 0; i < right.length; i++) {
res = Math.max(res, n - right[i]);
}
return res;
}
}
初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bulb-switcher
以下思路参考自:
为什么平方数一定是亮着的?从数学角度证明
找下规律可以发现,灯泡被切换的轮数,是第i个灯泡的因数:
第1个:第一轮
第2个:第一轮、第二轮
第3个:第一轮、第三轮
第4个:第一轮、第二轮、第四轮
第10个:第一轮、第二轮、第五轮、第十轮
…
那么切换次数为奇数次的,最后是开的。那哪些数字有奇数个因数呢?完全平方数(简要证明下:P=A*B,A!=B,那么A和B一定是成对出现的,因子个数一定是偶数)。
class Solution {
public int bulbSwitch(int n) {
int res = 0;
for(int i = 1; i <= n; i ++) {
if(i * i <= n) {
res++;
}
else {
break;
}
}
return res;
}
}