theme: smartblue
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
种花问题
题目解析
题目难度:简单
题目素材解析
本道题,提供了两个素材:
一个整数数组flowerbad。
一个整数n。
并且保证整数数组长度在1到10000之间,其中的元素是非1即0。并且不会有连续的1存在。
我的解读
题目比较长,通过一个种花的问题,延伸到处理数组中的空位问题。
简而言之,是要从一个只包含1和0的整数数组中,将一些1覆盖到0元素上,并且要保证不能出现连续的1。
所以我们可以通过统计连续超过三个0的个数,然后存入到一个集合中,然后再做统一的计算。
这里还有几个特殊情况,比如首尾只要存在两个0就能插入一个1,中间有三个0才能插入一个1。
还有就是全部都是0的情况,数组长度等于1的情况,都需要处理一下。
解题思路
下面我们就来一步一步的来讲述一下代码逻辑。
第一步,先来处理数组长度等于1的情况,如果元素等于0,则比对n和1的大小值,返回结果。
第二步,开始统计连续三次0出现的次数和序列数值。
第三步,开始处理全是0的情况。
第四步,开始处理最后一波为0的个数是否等于或者超过2次,因为是尾部,所以也试做加1。
第五步,开始处理头部的0是否存在连续两个0以上的情况。
第六步,开始正式转换数值,通过规律来计算出具体值。
第七步,比对和n的大小。
下面我们就来看一下代码编写情况。
代码
本次代码执行如下:
```java public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.canPlaceFlowers(new int[]{1,0,0,0,0}, 2));
System.out.println(solution.canPlaceFlowers(new int[]{0,0}, 2));
}
public boolean canPlaceFlowers(int[] flowerbed, int n) {
if(flowerbed.length == 1){
if(flowerbed[0] == 0){
return n <= 1;
}else{
return n <= 0;
}
}
List<Integer> kongweiList = new ArrayList<>();
int kongweiCount = 0;
for (int j : flowerbed) {
if (j == 0) {
kongweiCount++;
} else if (kongweiCount >= 3) {
kongweiList.add(kongweiCount);
kongweiCount = 0;
} else {
kongweiCount = 0;
}
}
int r = 0;
//全是0的情况
if(kongweiCount == flowerbed.length){
return flowerbed.length / 2 >= n;
}
//首尾是否存在0的情况
if(kongweiCount >= 2){
kongweiList.add(++kongweiCount);
}
if(flowerbed.length >= 3 && flowerbed[0] == 0 && flowerbed[1] == 0){
r++;
}
for (Integer k : kongweiList){
r = r + (k - 1) / 2;
}
return r >= n;
}
} ```
执行结果
这次的执行结果就很一般了,内存消耗太严重,没有找出关键的规律,只是在处理各种情况导致的。
欢迎加入专栏,一起来刷题。