自己的思路:直接遍历一遍,如果当前位置可以种花则种,最后跟0比较决定返回true/false。
学习别人的代码风格&&思路(直接跳格子,这样也不会对原来的数组进行修改):
(1)当遇到1时,说明这个位置有花,那必然从index+2的位置才有可能种花,因此当碰到1时直接跳过下一格。
(2)当遇到0时,由于1都是跳两格,所以前面必然是0,此时看一下后面是0吗,是?此时能种花,然后把当前格看成1继续跳两格。不是?跳三格。
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int m) {
int n = flowerbed.size();
int i = 0;
while (i < n && m) { //m写在这里好一点,如果m一开始就是0的话就不会进入循环
if (flowerbed[i] == 1) i += 2;
else {
if (i + 1 == n || flowerbed[i + 1] == 0) {
//这样不用分情况得到后一位,因为||必须前面满足才会得到后一项
m--;
i += 2;
}else {
i += 3;
}
}
}
return m == 0; //直接跟0比较返回,不用写条件表达式
}
};