返回介绍

solution / 0600-0699 / 0605.Can Place Flowers / README_EN

发布于 2024-06-17 01:03:36 字数 5055 浏览 0 评论 0 收藏 0

605. Can Place Flowers

中文文档

Description

You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots.

Given an integer array flowerbed containing 0's and 1's, where 0 means empty and 1 means not empty, and an integer n, return true _if_ n _new flowers can be planted in the_ flowerbed _without violating the no-adjacent-flowers rule and_ false _otherwise_.

 

Example 1:

Input: flowerbed = [1,0,0,0,1], n = 1
Output: true

Example 2:

Input: flowerbed = [1,0,0,0,1], n = 2
Output: false

 

Constraints:

  • 1 <= flowerbed.length <= 2 * 104
  • flowerbed[i] is 0 or 1.
  • There are no two adjacent flowers in flowerbed.
  • 0 <= n <= flowerbed.length

Solutions

Solution 1: Greedy

We directly traverse the array $flowerbed$. For each position $i$, if $flowerbed[i]=0$ and its adjacent positions on the left and right are also $0$, then we can plant a flower at this position. Otherwise, we cannot. Finally, we count the number of flowers that can be planted. If it is not less than $n$, we return $true$, otherwise we return $false$.

The time complexity is $O(n)$, where $n$ is the length of the array $flowerbed$. We only need to traverse the array once. The space complexity is $O(1)$.

class Solution:
  def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
    flowerbed = [0] + flowerbed + [0]
    for i in range(1, len(flowerbed) - 1):
      if sum(flowerbed[i - 1 : i + 2]) == 0:
        flowerbed[i] = 1
        n -= 1
    return n <= 0
class Solution {
  public boolean canPlaceFlowers(int[] flowerbed, int n) {
    int m = flowerbed.length;
    for (int i = 0; i < m; ++i) {
      int l = i == 0 ? 0 : flowerbed[i - 1];
      int r = i == m - 1 ? 0 : flowerbed[i + 1];
      if (l + flowerbed[i] + r == 0) {
        flowerbed[i] = 1;
        --n;
      }
    }
    return n <= 0;
  }
}
class Solution {
public:
  bool canPlaceFlowers(vector<int>& flowerbed, int n) {
    int m = flowerbed.size();
    for (int i = 0; i < m; ++i) {
      int l = i == 0 ? 0 : flowerbed[i - 1];
      int r = i == m - 1 ? 0 : flowerbed[i + 1];
      if (l + flowerbed[i] + r == 0) {
        flowerbed[i] = 1;
        --n;
      }
    }
    return n <= 0;
  }
};
func canPlaceFlowers(flowerbed []int, n int) bool {
  m := len(flowerbed)
  for i, v := range flowerbed {
    l, r := 0, 0
    if i > 0 {
      l = flowerbed[i-1]
    }
    if i < m-1 {
      r = flowerbed[i+1]
    }
    if l+v+r == 0 {
      flowerbed[i] = 1
      n--
    }
  }
  return n <= 0
}
function canPlaceFlowers(flowerbed: number[], n: number): boolean {
  const m = flowerbed.length;
  for (let i = 0; i < m; ++i) {
    const l = i === 0 ? 0 : flowerbed[i - 1];
    const r = i === m - 1 ? 0 : flowerbed[i + 1];
    if (l + flowerbed[i] + r === 0) {
      flowerbed[i] = 1;
      --n;
    }
  }
  return n <= 0;
}
impl Solution {
  pub fn can_place_flowers(flowerbed: Vec<i32>, n: i32) -> bool {
    let (mut flowers, mut cnt) = (vec![0], 0);
    flowers.append(&mut flowerbed.clone());
    flowers.push(0);

    for i in 1..flowers.len() - 1 {
      let (l, r) = (flowers[i - 1], flowers[i + 1]);
      if l + flowers[i] + r == 0 {
        flowers[i] = 1;
        cnt += 1;
      }
    }
    cnt >= n
  }
}
class Solution {
  /**
   * @param Integer[] $flowerbed
   * @param Integer $n
   * @return Boolean
   */
  function canPlaceFlowers($flowerbed, $n) {
    array_push($flowerbed, 0);
    array_unshift($flowerbed, 0);
    for ($i = 1; $i < count($flowerbed) - 1; $i++) {
      if ($flowerbed[$i] === 0) {
        if ($flowerbed[$i - 1] === 0 && $flowerbed[$i + 1] === 0) {
          $flowerbed[$i] = 1;
          $n--;
        }
      }
    }
    return $n <= 0;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文