吴师兄学算法day08 贪心 605. 种花问题
题目:605. 种花问题
易错点:
- 没想出来,借鉴了灵山的代码的思路,强行种花。
- 我喜欢这个思路。感觉有点像设置哨兵那样的。
我的代码:
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
# 修改数组,每次都种花,
# 凑够3个0 就种花
size = len(flowerbed) # 假设是10
new_flowebed = [0] + flowerbed +[0] # 总长度 size + 2 # 现在长度12
for i in range(1,size+1): # 闭区间,(1,11) # 取1,2..8,9,10
if new_flowebed[i-1] == 0 and new_flowebed[i] == 0 and new_flowebed[i+1] == 0:
new_flowebed[i] = 1 # 种花
n -=1
# 最后种完,n小于等于0 说明都种完了
if n <= 0 :
return True
else:
return False
可以优化那个size
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
# 每次都种花,创建一个新的数组
# 凑够3个0 就种花
new_flowebed = [0] + flowerbed +[0]
for i in range(1,len(new_flowebed)-1): ###这里取新数组的长度,最后一位不要,首位也不要
if new_flowebed[i-1] == 0 and new_flowebed[i] == 0 and new_flowebed[i+1] == 0:
new_flowebed[i] = 1 # 种花
n -=1
# 最后种完,n小于等于0 说明都种完了
if n <= 0 :
return True
else:
return False
老师的代码:
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
# 遍历数组,在遍历过程中,采取贪心的思路,并不需要【每个位置】都去查看是否可以种花
# 1、当前位置已经种花,那么后一个位置明显不能种花,可以跳过去
# 2、当前位置没有种花,需要考虑后面一个位置是否种花
i = 0
while i < len(flowerbed) and n > 0 :
# 1、当前位置已经种花,那么后一个位置明显不能种花,可以跳过去
# 所以让 i 执行加 2 操作,跳过了加 1 后的那个位置
if flowerbed[i] == 1 :
# 让 i 执行加 2 操作
i += 2
# 2、说明当前位置没有种花 flowerbed[i] == 0
# 3、如果这个位置是数组的最后一个位置,说明后一个位置不存在,没有限制,说明 flowerbed[i] 可以种花
# 4、如果这个位置【不是】数组的最后一个位置,那么只有后一个位置【没有种花】,才有资格在 flowerbed[i] 位置种花
elif i == len(flowerbed) - 1 or flowerbed[i + 1] == 0 :
# 以上两种条件都可以在 flowerbed[i] 位置种花
# 成功之后,所需目标减 1
n -= 1
# 在 flowerbed[i] 位置种花之后,i + 1 位置不需要去考虑了,因为它明显不能种花,可以跳过去
# 让 i 执行加 2 操作
i += 2
# 5、说明当前位置没有种花 flowerbed[i] == 0
# 6、但是后一个位置已经种花了,那么当前位置无法采取种花操作
else:
# i + 1 位置已经种花,不用再去访问一遍
# i + 2 位置考虑到 i + 1 位置已经种花,所以也无法种花,不用再去访问
# 让 i 执行加 3 操作
i += 3
# 最后查看是否用完了 n
return n <= 0
灵山的写法:
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
flowerbed = [0] + flowerbed + [0]
for i in range(1, len(flowerbed) - 1):
if flowerbed[i - 1] == 0 and flowerbed[i] == 0 and flowerbed[i + 1] == 0:
flowerbed[i] = 1 # 种花!
n -= 1
return n <= 0
作者:灵茶山艾府
链接:https://leetcode.cn/problems/can-place-flowers/solutions/2463018/ben-ti-zui-jian-dan-xie-fa-pythonjavacgo-6a6k/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结:
- 更喜欢灵山的思路,简洁优雅!
- 贪心贪心, 脑筋急转弯哈哈
参考:
https://r07na4yqwor.feishu.cn/docx/FePNdozgUo7yZBx48tLcbXVUnIc