力扣周赛第252期(上)

132 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

1952. 三除数

截屏2021-08-15 下午7.03.56.png

思路分析

如果存在整数 k ,满足 n = k * m ,那么整数 m 就是 n 的一个 除数 。但其实是有两个除数,k和m都是,只有一种情况是一个除数,那就是k和m是一个值的时候。

但是又由于k等于1的时候,又是两个除数。所以其实就是看有没有这个i,i*i = n。

由于假设 i * i = n = x * y,且x,y不等于i,则xy必有一个大于i,必有一个小于i。

因此这道题就是求第一个能被n整除的数字是否是i即可。

1955. 统计特殊子序列的数目

截屏2021-08-15 下午7.30.58.png

思路分析

本以为是道排列组合题,后来发现是可以存在 [0,1,2,0,1,2] 这种情况的。

尝试使用动态规划解决这个问题,动态规划首要解决的是状态转移方程,状态转移方程需要先想出来状态表示。

首先设dp[i]为前i位的子序列的数量。那么第i+1位如果是2,就可以简单的dp[i + 1] = dp[i] + dp[i] + 1.

但是第i+1位如果是1或者0,就没办法计算了,因此需要可以记录只有0和只有01的子序列的dp[i][0]和dp[i][1],

对于dp[i][0],dp[i][0] = dp[i - 1][0] + dp[i - 1][0] + 1,

对于dp[i][1],一方面要考虑当第i位等于1的时候从只有0的子序列变为01,以及继承01么,则有 dp[i][1] = dp[i - 1][1] + dp[i - 1][1] + 1 + 如果第i位等于1(dp[i - 1][0])

同理推断出dp[i][2],就可以得到答案。