7/13 leetcode

7/13 leetcode

1.哈希表应用

0001 April July October 0002 April July October 0003 April July October 0004 建立哈希表 表一存入哈希表 比较对应项 现有任务 取两个数组的交集
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个座位,而第一个进去寻找座位的人没有得知自己作为的方法,所以他只能随机寻找座位,之后的乘客都知道自己的座位号,而且在寻找座位的时候都满足以下要求:

  1. 如果自己的座位没有被坐,则坐上。
  2. 如果自己的座位被他人占用,则随机坐入其他空位。

   试求最后一位客人坐上自己座位的概率。
   窩傻眼了,赶紧动了动不太灵光的小脑子,

   “诶,第一种情况是完美情况,第一个人坐上了本属于自己的位子,第 n n n位的乘客必能坐上自己的位子。
   然后是第一位乘客作sit到了最后一位乘客的seat上,这么一来,还是经典白忙活,他不可能坐上了。
   接下来就复杂了,如果第一个大马虎坐到了第 i ( 2 ≤ i ≤ n − 1 ) i(2 \leq i \leq n-1) i2in1个座位,我们姑且把座位与人物的序号统一。”(其实前两种情况完全可以归纳到这里面来^^)

   我晃了晃神,害,这有点烦啊! 让我们假设大马虎坐到了第 i i i个座位上,而这样处于 [ 2 , i − 1 ] [2,i-1] [2,i1]区间内的座位都迎来他们专属的主人,这时轮到 i i i号客人做抉择,他会去哪呢?

   无论他去哪,则 [ i , n ] [i,n] [i,n]区间并上孤零零的 [ 1 ] [1] [1]形成了一个新的飞机问题,这位大马虎仿佛坐了时光机,来到了另一样人数只有 n − i + 1 n-i+1 ni+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=2nfni+1},f(n1)=n11{1+i=2n1fni}, n f ( n ) − ( n − 1 ) f ( n − 1 ) = f ( n − 1 ) ⇒ nf(n)-(n-1)f(n-1)=f(n-1)\Rightarrow nf(n)(n1)f(n1)=f(n1) f ( n ) = f ( n − 1 ) f(n)=f(n-1) f(n)=f(n1)

  感觉真拉到数论里头来说的话,应该没有浙江高考的难度,但是在理解层面来说有时独一档,是可以令人眼前一亮的内种。啊?还没完,这之后就连等到一个 f ( 2 ) f(2) f(2),两个人的飞机概率不就是0.5嘛!害,经典白忙活,就这,我蒙也蒙0.5啊!挺奇怪的熬┗|`O′|┛ 嗷~~编程就不多说了,双百稳稳的!
  

3.还是头脑风暴之灯泡数学

  又是头脑风暴,我都感觉在做奥数题都。原题如下:

“初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。”-----leetcode-cn.com

  ???又来,第一反应绝对是模拟过程,你看这可比之前的大飞机好模拟多了呀!模型也没那么复杂,直接双层循环,欸,双层循环好像听说不推荐额,那么用啥呢?还是数学!想一想灯泡无非开关两种状态,类似于负负得正这样子,决定亮灭的只是它改变状态的次数,而改变的次数由其因子也就是可以被整除的除数数量来决定的,一般的数是有偶数个因子的,因此最终是灭,而平方数不一样,它有奇数个因子(两个相同的因子),可以满足最终为亮的状态。

项数平方数统计
103
204
10010
n 2 n^2 n2n

  其实也不用列表了,项数开方取下整即为区间内包含的平方数目,这也是很容易理解的。
  一样的,这个代码也是稳定双百。
  下次见啦! ^^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值