1.哈希表应用
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
unordered_map<int,int> pmap;
for(int num:nums1)
{
pmap[num]++;
}
for(int num:nums2)
{
if(pmap[num])
{
result.push_back(num);
pmap[num]--;
}
}
return result;
}
};
哈希表第一次是在大二上数据结构的时候接触到,然后也没有在编程中实践学习过,而后在JAVA中间的比较多,因此莫名地感觉到哈希表在编程中应用到还是挺多的。个人感觉哈希表更像是一个比较方便的数组,但缺点在于不能像数组那样有规律的,更符合我们的思考方式地去处理问题。
还有就是for(nums:array){;}
这个式子也是很简洁实用的,在我关于BUFF/IGXE取价的JAVA小程序里也有用到,考虑之后有时间再重新回头去梳理改进优化下之前写的代码。
2.头脑风暴之空客A999
原题是这样说的, n n n名素质极高的乘客排好队搭乘一辆飞机,这个飞机当然理想情况恰好 n n n个座位,而第一个进去寻找座位的人没有得知自己作为的方法,所以他只能随机寻找座位,之后的乘客都知道自己的座位号,而且在寻找座位的时候都满足以下要求:
- 如果自己的座位没有被坐,则坐上。
- 如果自己的座位被他人占用,则随机坐入其他空位。
试求最后一位客人坐上自己座位的概率。
窩傻眼了,赶紧动了动不太灵光的小脑子,
“诶,第一种情况是完美情况,第一个人坐上了本属于自己的位子,第 n n n位的乘客必能坐上自己的位子。
然后是第一位乘客作sit到了最后一位乘客的seat上,这么一来,还是经典白忙活,他不可能坐上了。
接下来就复杂了,如果第一个大马虎坐到了第 i ( 2 ≤ i ≤ n − 1 ) i(2 \leq i \leq n-1) i(2≤i≤n−1)个座位,我们姑且把座位与人物的序号统一。”(其实前两种情况完全可以归纳到这里面来^^)
我晃了晃神,害,这有点烦啊! 让我们假设大马虎坐到了第 i i i个座位上,而这样处于 [ 2 , i − 1 ] [2,i-1] [2,i−1]区间内的座位都迎来他们专属的主人,这时轮到 i i i号客人做抉择,他会去哪呢?
无论他去哪,则 [ i , n ] [i,n] [i,n]区间并上孤零零的 [ 1 ] [1] [1]形成了一个新的飞机问题,这位大马虎仿佛坐了时光机,来到了另一样人数只有 n − i + 1 n-i+1 n−i+1的新飞机,而他又恰好是第一个登机的,历史总是惊人的类似。
说到这,应该有点感觉,“是递归!最终会将概率求解化简至简单的二值问题!”,wow,好聪明就是这样!接下来我们推导一下:
f
(
n
)
=
1
n
{
1
+
∑
i
=
2
n
f
(
n
−
i
+
1
)
}
,
f
(
n
−
1
)
=
1
n
−
1
{
1
+
∑
i
=
2
n
−
1
f
(
n
−
i
)
}
,
}
⇒
\begin{aligned} \left.\begin{aligned} f(n)= \frac{1}{n}\lbrace 1+\sum_{i=2}^{n}f(n-i+1)\rbrace,\\ %加&指定对齐位置 f(n-1)= \frac{1}{n-1}\lbrace 1+\sum_{i=2}^{n-1}f(n-i)\rbrace, \end{aligned} \right\} %加右} \qquad \text{} \end{aligned} \Rightarrow
f(n)=n1{1+i=2∑nf(n−i+1)},f(n−1)=n−11{1+i=2∑n−1f(n−i)},⎭⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎫⇒
n
f
(
n
)
−
(
n
−
1
)
f
(
n
−
1
)
=
f
(
n
−
1
)
⇒
nf(n)-(n-1)f(n-1)=f(n-1)\Rightarrow
nf(n)−(n−1)f(n−1)=f(n−1)⇒
f
(
n
)
=
f
(
n
−
1
)
f(n)=f(n-1)
f(n)=f(n−1)
感觉真拉到数论里头来说的话,应该没有浙江高考的难度,但是在理解层面来说有时独一档,是可以令人眼前一亮的内种。啊?还没完,这之后就连等到一个
f
(
2
)
f(2)
f(2),两个人的飞机概率不就是0.5嘛!害,经典白忙活,就这,我蒙也蒙0.5啊!挺奇怪的熬┗|`O′|┛ 嗷~~编程就不多说了,双百稳稳的!
3.还是头脑风暴之灯泡数学
又是头脑风暴,我都感觉在做奥数题都。原题如下:
“初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。”-----leetcode-cn.com
???又来,第一反应绝对是模拟过程,你看这可比之前的大飞机好模拟多了呀!模型也没那么复杂,直接双层循环,欸,双层循环好像听说不推荐额,那么用啥呢?还是数学!想一想灯泡无非开关两种状态,类似于负负得正这样子,决定亮灭的只是它改变状态的次数,而改变的次数由其因子也就是可以被整除的除数数量来决定的,一般的数是有偶数个因子的,因此最终是灭,而平方数不一样,它有奇数个因子(两个相同的因子),可以满足最终为亮的状态。
项数 | 平方数统计 |
---|---|
10 | 3 |
20 | 4 |
100 | 10 |
… | … |
n 2 n^2 n2 | n |
其实也不用列表了,项数开方取下整即为区间内包含的平方数目,这也是很容易理解的。
一样的,这个代码也是稳定双百。
下次见啦! ^^