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 if n new flowers can be planted in the flowerbed without violating the no-adjacent-flowers rule.
下面是普通的贪心做法,需要考虑三种边界条件,时间复杂度还可以继续优化.
优化前代码
class Solution {
public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int len = flowerbed.size();if(n == 0) return true;if(len == 1){if(flowerbed[0] == 1) return false;else return true;}if(flowerbed[0] == 0 && flowerbed[1] == 0){flowerbed[0] = 1;n--;}for(int i = 1; i < len-1; i++){if(flowerbed[i-1] == 0 && flowerbed[i+1] == 0 && flowerbed[i] == 0){flowerbed[i] = 1;n--;}if(n == 0) return true;}if(flowerbed[len-2] == 0 && flowerbed[len-1] == 0){flowerbed[len-1] = 1;n--;}if(n != 0) return false;else return true;}
};
倘若当前位置是有花的或者是刚种下花,说明下一个位置不能种花,可以直接跳过。
优化后代码
class Solution {
public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int len = flowerbed.size();if(n == 0) return true;if(len == 1){if(flowerbed[0] == 1) return false;else return true;}if(flowerbed[0] == 0 && flowerbed[1] == 0){flowerbed[0] = 1;n--;}for(int i = 1; i < len-1; i++){if(flowerbed[i] == 1)i++;else if(flowerbed[i-1] == 0 && flowerbed[i+1] == 0){n--;flowerbed[i] = 1;i++;}if(n == 0) return true;}if(flowerbed[len-2] == 0 && flowerbed[len-1] == 0){flowerbed[len-1] = 1;n--;}if(n != 0) return false;else return true;}
};