吴师兄学算法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

灵山题解

posted @ 2024-01-19 19:32  o蹲蹲o  阅读(6)  评论(0编辑  收藏  举报