1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题其实可以有更优雅的解决方法的,毕竟答案必然是质数的平方数。
不过鉴于这就是一道easy的题目,我们就直接按照暴力求解的方法进行解答了。
2. 代码实现
给出python代码实线如下:
class Solution:
def isThree(self, n: int) -> bool:
return len([x for x in range(1, n+1) if n % x == 0]) == 3
提交代码评测得到:耗时36ms,占用内存14.3MB。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
由于题目要求邻位必须不同,因此,事实上只有一种情况会导致必然存在邻位相同的情况,即存在单个数字的个数超过总数的一半以上,此时,无论怎样排列总会出现两个相邻的情况,否则的话,我们只需要不断地选择最多的一个数据然后进行插入就总能够成功构建目标序列。
因此,我们只需要对最多的一个数据进行统计即可得到最后的答案。
2. 代码实现
给出python代码实现如下:
class Solution:
def numberOfWeeks(self, milestones: List[int]) -> int:
s = sum(milestones)
m = max(milestones)
return min(s, 2*(s-m)+1)
提交代码评测得到:耗时720ms,占用内存25.7MB。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题事实上算是一道数列问题吧,我们很容易就能够求能够求出,当距离原点的距离从 n − 1 n-1 n−1变为 n n n时,增加的苹果数目为: 12 n 2 12n^2 12n2,即总苹果数目的递推公式为: s n + 1 = s n + 12 n 2 s_{n+1} = s_n + 12n^2 sn+1=sn+12n2。
求解上述数列可以得到
s
n
s_n
sn的表达式为:
s
n
=
4
n
3
+
6
n
2
+
2
n
s_n = 4n^3+6n^2+2n
sn=4n3+6n2+2n
因此,我们就可以通过二分法快速地得到要获得目标数目的苹果数目,所需要的边长 n n n,此时最后的周长长度就是 8 n 8n 8n。
2. 代码实现
给出python代码实现如下:
class Solution:
def minimumPerimeter(self, neededApples: int) -> int:
i, j = 0, 10**5
while i < j-1:
x = (i+j)//2
s = 4*x**3+6*x**2+2*x
if s >= neededApples:
j = x
else:
i = x
return j*8
提交代码评测得到:耗时36ms,占用内存14.3MB。
4. 题目四
给出题目四的试题链接如下:
1. 解题思路
这一题一开始就想的很复杂,就是不断地去找两个中间的两个节点,然后直接计算前中后之中0,1,2的数目,不过这样的算法就是 O ( N 2 ) O(N^2) O(N2)的算法复杂度,因此怎么调整都会超时。
然后看了一下别人的解法,瞬间就被惊呆了,就是一个倒推,然后就在 O ( N ) O(N) O(N)的时间复杂度内瞬秒了,简直惊呆了。
我们首先定义三个变量
a
,
b
,
c
a,b,c
a,b,c,分别表示012
的序列个数,12
的序列个数和只有若干个2
的序列个数,则我们快速地就能够得到状态转移关系:
{ a = 2 a + b x i = 0 b = 2 b + c x i = 1 c = 2 c + 1 x i = 2 \left\{ \begin{aligned} a = 2a + b & & x_i = 0 \\ b = 2b + c & & x_i = 1 \\ c = 2c + 1 & & x_i = 2 \end{aligned} \right. ⎩⎪⎨⎪⎧a=2a+bb=2b+cc=2c+1xi=0xi=1xi=2
状态转移关系也极好解释,显然当 x i = 2 x_i = 2 xi=2时,此时只和 c c c有关, c c c的总数就会变为 2 c + 1 2c+1 2c+1,分别代表保留原有的序列,在原有的序列前面多加一个 2 2 2,以及只取当前的 2 2 2这3种情况。
同样的我们就可以有另外两个状态转移公式,然后我们倒序遍历一下即可得到我们最终的结果。
2. 代码实现
给出python代码实现如下:
class Solution:
def countSpecialSubsequences(self, nums: List[int]) -> int:
MOD = 10**9+7
n = len(nums)
a, b, c = 0, 0, 0
for i in nums[::-1]:
if i == 2:
c = (2 * c + 1)%MOD
elif i == 1:
b = (2 * b + c) % MOD
else:
a = (2 * a + b) % MOD
return a
提交代码评测得到:耗时1888ms,占用内存18MB。