605 种花问题(双指针)

43 篇文章 0 订阅

1. 问题描述:

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。

示例 1:

输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

示例 2:

输入:flowerbed = [1,0,0,0,1], n = 2
输出:false

提示:

1 <= flowerbed.length <= 2 * 10 ^ 4
flowerbed[i] 为 0 或 1
flowerbed 中不存在相邻的两朵花
0 <= n <= flowerbed.length
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/can-place-flowers

2. 思路分析:

分析题目可以发现能够填1的数目完全取决于连续的0的数目,所以我们需要计算出连续一段0的数目,这里可以分为三种情况,若连续的0的数目为k,当连续的一段0是内部的0,也即当前连续的0的左右端点都是1可以发现能够填1的数目为(k - 1) / 2,当连续的一段0包含了左边界那么能够填1的数目为k / 2,当连续的一段0包含了左右边界那么能够填1的数目为(k + 1) / 2,计算连续1的数目可以使用双指针算法,固定起点对应的指针i,指针j往后移动,当指针j停止之后那么[i,j)一段就是连续的0的数目。

3. 代码如下:

from typing import List


class Solution:
    # 分情况讨论即可
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        if n == 0: return True
        i = 0
        res = 0
        while i < len(flowerbed):
            if flowerbed[i] == 1:
                i += 1
                continue
            # 双指针算法
            j = i
            while j < len(flowerbed) and flowerbed[j] == 0: j += 1
            # 判断属于哪一种情况
            # 一开始的时候假定为内部得了连续0
            k = j - i - 1
            # 如果是左边界
            if i == 0: k += 1
            # 如果是右边界
            if j == len(flowerbed): k += 1
            res += k // 2
            if res >= n: return True
            i = j
        return False
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值