zoukankan      html  css  js  c++  java
  • 605. Can Place Flowers【easy】

    605. Can Place Flowers【easy】

    Suppose 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 - they would compete for water and both would die.

    Given a flowerbed (represented as an array containing 0 and 1, where 0 means empty and 1 means not empty), and a number n, return if n new flowers can be planted in it without violating the no-adjacent-flowers rule.

    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
    

    Note:

    1. The input array won't violate no-adjacent-flowers rule.
    2. The input array size is in the range of [1, 20000].
    3. n is a non-negative integer which won't exceed the input array size.

    错误解法:

     1 class Solution {
     2 public:
     3     bool canPlaceFlowers(vector<int>& flowerbed, int n) {
     4         int max = 0;
     5         int temp = 0;
     6         
     7         for (int i = 0; i < flowerbed.size(); ++i)
     8         {
     9             if (flowerbed[i] == 0)
    10             {
    11                 temp++;
    12                 max = temp > max ? temp : max;
    13             }
    14             else
    15             {
    16                 temp = 0;
    17             }
    18         }
    19 
    20         
    21         if ((max - 2) % 2)
    22         {
    23             return ((max - 2) / 2 + 1 >= n); 
    24         }
    25         else
    26         {
    27             return ((max - 2) / 2 >= n);
    28         }
    29     }
    30 };

    想要用最长连续的0去求,调试了很久,但还是条件判断有问题,这种方法不妥!

    参考大神们的解法,如下:

    解法一:

     1 public class Solution {
     2     public boolean canPlaceFlowers(int[] flowerbed, int n) {
     3         int count = 0;
     4         for(int i = 0; i < flowerbed.length && count < n; i++) {
     5             if(flowerbed[i] == 0) {
     6          //get next and prev flower bed slot values. If i lies at the ends the next and prev are considered as 0. 
     7                int next = (i == flowerbed.length - 1) ? 0 : flowerbed[i + 1]; 
     8                int prev = (i == 0) ? 0 : flowerbed[i - 1];
     9                if(next == 0 && prev == 0) {
    10                    flowerbed[i] = 1;
    11                    count++;
    12                }
    13             }
    14         }
    15         
    16         return count == n;
    17     }
    18 }

    解法二:

    1 public boolean canPlaceFlowers(int[] flowerbed, int n) {
    2     for (int idx = 0; idx < flowerbed.length && n > 0; idx ++)
    3         if (flowerbed [idx] == 0 && (idx == 0 || flowerbed [idx - 1] == 0) && (idx == flowerbed.length - 1 || flowerbed [idx + 1] == 0)) {
    4             n--;
    5             flowerbed [idx] = 1;
    6         }
    7     return n == 0;
    8 }

    解法一和解法二都需要随时更新原来数组的状态

    解法三:

     1 class Solution {
     2 public:
     3     bool canPlaceFlowers(vector<int>& flowerbed, int n) {
     4         flowerbed.insert(flowerbed.begin(),0);
     5         flowerbed.push_back(0);
     6         for(int i = 1; i < flowerbed.size()-1; ++i)
     7         {
     8             if(flowerbed[i-1] + flowerbed[i] + flowerbed[i+1] == 0)
     9             {
    10                 --n;
    11                 ++i;
    12             }
    13                 
    14         }
    15         return n <=0;
    16     }
    17 };

    不更新原来数组的值,通过多移下标来实现

  • 相关阅读:
    Ubuntu环境下mysql常见的操作
    Ubuntu 下 Galera cluster for MySQL 集群安装
    Linux如何查看进程、杀死进程、启动进程等常用命令
    Ubuntu16.04配置静态IP地址
    Linux软件包管理之源码包、脚本安装包
    Linux软件包管理之yum在线管理
    Linux软件包管理之RPM命令
    Linux文本编辑器vim
    Linux常用命令之网络和关机重启命令
    Linux常用命令之压缩和解压缩命令
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7536780.html
Copyright © 2011-2022 走看看