0%

爱恨分明的各路人色(剧透吐槽)

亚当,可能是感觉转变最细腻的一个角色了

从一个整天面无表情的四肢发达头脑简单的霸凌大块头,逐渐展露出内心对自己取向的拒绝,被冷漠的父亲养成的外壳式自我坚强,高大的身体里好像一个弱小委屈的小男孩在迷茫地用最原始的粗暴探寻自己的道路。最后到面对自己面对外界,当着全校学生和家长的面,牵起埃里克的手,甚至开始温温柔柔地像邻家大男孩。

最后在埃里克家长面前收获真爱并且被家长夸赞,嘴角第一次弧度上扬,可爱。当然埃里克说的其实也很有道理,欺凌了那么久,给埃里克造成了那么久的打击,别人不原谅他不和他做朋友是理所应当的,不过和梅芙一开始不原谅母亲不同,他勇敢地面对了自己的一切,努力地转变着自己的行为,最后大家都可以选择原谅和不原谅,都是合情合理的。

相反梅芙妈那边就不一样了,明明没啥改变还指责别人不原谅自己?不原谅是人家的合情合理。更何况不值得原谅。

阅读全文 »

又是一个被复制粘贴的脏教程坑的案例,此文献给从泥沼中求生的安装者。

pip install pyqt5 pip install pyqt5-tools

安装就这样,最好给个管理员权限。

designer所在目录AppData\Local\Programs\Python\Python37\Lib\site-packages\qt5_applications\Qt\bin

不是脏教程写的乱七八糟的什么在pyqt-tools下面,什么pyqt的QT下面,东抄西抄把过时的东西留到现代太烦了。

欢呼

2020.9.1——2021.3.27

3 月, 3 周, 4 天 + 3 月, 1 天 = 6 月, 3 周, 5 天

116+91=207 天

3.28 打电话通知预录取了。结束啦,我的仓促平凡的考研生活。

阅读全文 »

排序

快速排序

在数组中选定一个分界数pivot, 然后将所有其他的数和它进行比较,大于的小于的分成两部分,pivot放中间,这样这一轮就确定了一个数的位置,然后递归左右两边继续快排即可:

  1. 首先确定一个分界数:可以直接固定取最开始或者最后的那个数,也可以用随机算法。随机取数会使效率更加稳定。然后把这个数交换到 end,以便前面进行分块。

  2. 如何将大于和小于的两部分分开:我们目标是让小于的部分在前,大于的部分在后————两种分割方法:

  • 一种是利用两个标志位,lo=starthi=end-1,然后两个标志位互相把不该在自己这里的数丢给对方if (nums[lo]>pivot),显然 nums[lo] 的值不应该在 lo 所处的小于区,因此我们把它丢到大于区swap(nums[lo],nums[hi]);hi--;。而 lo 获得了 hi 交换过去的数,大于小于性未知,lo 不能动。

  • 另一种利用一个标志位和一个遍历位,即lo=start-1cur=start。cur 从 start 遍历到 end-1 ,lo 指示着小于区的边界。我们只要把小于区分好,那么大于区自然就分好了。

    if (nums[cur]<pivot) 即当前数应该添加到小于区,因此交换swap(nums[cur],nums[++lo]);。注意从 ++lo 换给 cur 的数必然是 cur 走过的,因此换完cur++即可。

阅读全文 »

丑数II

编写一个程序,找出第 n 个丑数。

丑数就是质因数只包含 2, 3, 5 的正整数。

示例:

输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明:  

1 是丑数。 n 不超过1690。

算法思想

显而易见,我们要找分解式为 2 3 5 构成的数。也容易想到,后面的丑数必然是由前面的丑数乘 2 3 5 得到的

但是从前往后顺序计算乘积,并且顺序存放的话,例如2*5 3*3。可以看出先后顺序错位了,10先存放,而9后存放。

因此要取计算的所有乘积的最小值, 这个最小值必然是从小到大的下一个ugly,解决了存放的错位问题。

但是对哪些乘积取最小值呢?

前面的数都计算一遍乘积的话计算量太大

想一下,假如有 2*3, 那么对所有x2,x*3必然没有2*3小,因此对 3 这个因子,只需要计算它和2的乘积即可。后面的肯定不是我们要找的最小乘积。

因此,其实只要为每个因子找到当前最小的乘数即可

怎么确定每个因子的当前最小乘数呢?

要找当前最小的,首先要确定这个因子的候选乘数有哪些,然后在里面找最小的。

哪些是候选乘数?

我们找当前最小乘数是为了找出下一个最小的丑数。假如要生成所有丑数的话,每个因子都必然要遍历去乘每一个数。

换句话说,对这个因子,所有数都是要乘的,跑不了的,即所有没乘过的数,都是它的候选乘数。

最小的候选乘数

既然所有数都要乘,而我们的数又是从小到大排列的,那么从前往后,第一个没有乘过的就是当前最小乘数。

代码角度来看,即当前乘数为nums[i],每乘一次,即i++,准备乘下一个数即可。

解题代码

注意我们有三个因子,因此需要用三个指针对三个因子维护他们的最小乘数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
int nthUglyNumber(int n)
{
//动态规划,后面的数必然是前面的数乘 2 3 5得到
//但是顺序进行的话 2*5 3*3 ,可以看出大小顺序不能保证,因此要取几个乘积的最小值,这个最小值必然是从小到大的下一个ugly
//但是对哪些乘积取最小值呢?前面的数都计算一遍的话计算量太大。
//想一下,假如有 2*3, 那么对所有x2,x*3必然没有2*3小,因此对 3 这个乘积,其实只要找到最小的乘数即可,其他乘积也是一样
//怎么确定每个乘积的最小乘数呢?显然每个乘积都要乘每个数,那么从前往后找没乘过的 就是当前最小乘数

vector<int nums(n,0);
nums[0]=1;
int p2=0,p3=0,p5=0;
for(int i=1;i<n;i++)//除1外 生成n-1个丑数
{
int ugly_i=min(min(nums[p2]*2,nums[p3]*3),nums[p5]*5);//取当前乘积最小值
nums[i]=ugly_i;
//判断用的是哪个乘积,它的最小乘数要变了,注意重复的也算
if(ugly_i==nums[p2]*2) p2++;
if(ugly_i==nums[p3]*3) p3++;
if(ugly_i==nums[p5]*5) p5++;

}

return nums[n-1];

}
};