LeetCode讲解篇之2320. 统计放置房子的方式数
LeetCode讲解篇之2320.统计放置房子的方式数
问题描述
LeetCode2320题要求计算在一条街道的两侧(可视为两排)放置房子的方案数。街道由`n`个地块组成,每侧的地块排成一条直线。放置房子的规则是:相邻地块不能同时放置房子(即房子之间至少间隔一个空地)。需要计算两侧独立放置房子的总方案数,结果对`10^9+7`取模。
解题思路
1.问题拆解:
由于街道两侧独立,只需计算一侧的方案数,再平方即可得到总方案数。因此,问题转化为:在单排`n`个地块上放置房子且满足不相邻条件的方案数。
2.动态规划(DP):
定义`dp[i]`表示前`i`个地块的放置方案数:
-状态转移:
-若第`i`个地块不放房子,方案数为`dp[i-1]`。
-若放置房子,则第`i-1`个地块不能放,方案数为`dp[i-2]`。
-因此,`dp[i]=dp[i-1]+dp[i-2]`(斐波那契数列)。
-初始条件:
-`dp[0]=1`(空地块算一种方案)。
-`dp[1]=2`(放或不放)。
3.结果计算:
单排方案数为`dp[n]`,两侧总方案数为`dp[n]^2%MOD`。
代码实现
```python
MOD=109+7
classSolution:
defcountHousePlacements(self,n:int)->int:
ifn==1:
return4
dp=[0](n+1)
dp[0],dp[1]=1,2
foriinrange(2,n+1):
dp[i]=(dp[i-1]+dp[i-2])%MOD
return(dp[n]dp[n])%MOD
```
复杂度分析
-时间复杂度:`O(n)`,需遍历`n`个地块。
-空间复杂度:`O(n)`,可用滚动数组优化至`O(1)`。
总结
本题通过动态规划将问题转化为斐波那契数列,利用数学规律高效求解。关键在于理解单排方案数的平方即总方案数,以及相邻约束下的状态转移逻辑。掌握此类问题有助于解决更复杂的排列组合题目。
问题描述
LeetCode2320题要求计算在一条街道的两侧(可视为两排)放置房子的方案数。街道由`n`个地块组成,每侧的地块排成一条直线。放置房子的规则是:相邻地块不能同时放置房子(即房子之间至少间隔一个空地)。需要计算两侧独立放置房子的总方案数,结果对`10^9+7`取模。
解题思路
1.问题拆解:
由于街道两侧独立,只需计算一侧的方案数,再平方即可得到总方案数。因此,问题转化为:在单排`n`个地块上放置房子且满足不相邻条件的方案数。
2.动态规划(DP):
定义`dp[i]`表示前`i`个地块的放置方案数:
-状态转移:
-若第`i`个地块不放房子,方案数为`dp[i-1]`。
-若放置房子,则第`i-1`个地块不能放,方案数为`dp[i-2]`。
-因此,`dp[i]=dp[i-1]+dp[i-2]`(斐波那契数列)。
-初始条件:
-`dp[0]=1`(空地块算一种方案)。
-`dp[1]=2`(放或不放)。
3.结果计算:
单排方案数为`dp[n]`,两侧总方案数为`dp[n]^2%MOD`。
代码实现
```python
MOD=109+7
classSolution:
defcountHousePlacements(self,n:int)->int:
ifn==1:
return4
dp=[0](n+1)
dp[0],dp[1]=1,2
foriinrange(2,n+1):
dp[i]=(dp[i-1]+dp[i-2])%MOD
return(dp[n]dp[n])%MOD
```
复杂度分析
-时间复杂度:`O(n)`,需遍历`n`个地块。
-空间复杂度:`O(n)`,可用滚动数组优化至`O(1)`。
总结
本题通过动态规划将问题转化为斐波那契数列,利用数学规律高效求解。关键在于理解单排方案数的平方即总方案数,以及相邻约束下的状态转移逻辑。掌握此类问题有助于解决更复杂的排列组合题目。