ปัญหา
สมมติว่าเรามีแปลงดอกไม้ยาว ซึ่งบางแปลงปลูกแล้วและบางแปลงว่าง ตอนนี้มีข้อจำกัด คือ ไม่สามารถปลูกดอกไม้ในแปลงที่ติดกันได้ เพราะจะแข่งกันน้ำและทั้งคู่จะตาย ดังนั้น หากเรามีแปลงดอกไม้ แทนด้วยอาร์เรย์ที่มี 0 และ 1 โดย 0 แทนว่าง และ 1 แทนปลูกแล้ว และตัวเลข n ก็ถูกกำหนด เราต้องตรวจสอบว่าสามารถปลูกดอกไม้ใหม่ n ดอกได้หรือไม่โดยไม่ละเมิดกฎห้ามปลูกติดกัน
เช่น ถ้าผนวกเข้าเป็น flowerbed = [1,0,0,0,1], n = 1 ผลลัพธ์จะเป็น True
วิธีแก้ปัญหา
- ถ้าขนาดของ flowerbed < n: คืนค่า false
- ถ้าขนาดของ flowerbed เท่ากับ 1 และ flowerbed[0] เท่ากับ 0 และ n เท่ากับ 1: คืนค่า true
- for i := 0 ถึง ขนาดของ flowerbed - 1 ทำ:
- ถ้า n > 0:
- ถ้า i เท่ากับ 0:
- ถ้า flowerbed[i] เท่ากับ 0 และ flowerbed[1] เท่ากับ 0: flowerbed[0] := 1; ลด n ลง 1
- มิฉะนั้นถ้า i เท่ากับ ขนาดของ flowerbed - 1:
- ถ้า flowerbed[i] เท่ากับ 0 และ flowerbed[i - 1] ไม่เท่ากับ 1: flowerbed[i] := 1; ลด n ลง 1
- มิฉะนั้นถ้า flowerbed[i] เท่ากับ 0 และ flowerbed[i + 1] เท่ากับ 0 และ flowerbed[i - 1] เท่ากับ 0:
- flowerbed[i] := 1; ลด n ลง 1
- ถ้า i เท่ากับ 0:
- ถ้า n เท่ากับ 0: คืนค่า true
- ถ้า n > 0:
- ถ้า n เท่ากับ 0: คืนค่า true
- คืนค่า false
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
if (flowerbed.size() < n)
return false;
if (flowerbed.size() == 1 && flowerbed[0] == 0 && n == 1)
return true;
for (int i = 0; i < flowerbed.size(); i++) {
if (n > 0) {
if (i == 0) {
if (flowerbed[i] == 0 && flowerbed[1] == 0) {
flowerbed[0] = 1;
n--;
}
} else if (i == flowerbed.size() - 1) {
if (flowerbed[i] == 0 && flowerbed[i - 1] != 1) {
flowerbed[i] = 1;
n--;
}
} else if (flowerbed[i] == 0 && flowerbed[i + 1] == 0 && flowerbed[i - 1] == 0) {
flowerbed[i] = 1;
n--;
}
}
if (n == 0) {
return true;
}
}
if (n == 0) {
return true;
}
return false;
}
};
int main(){
Solution ob;
vector<int> v = {1,0,0,0,1};
cout << (ob.canPlaceFlowers(v, 1));
}
อินพุต
{1,0,0,0,1}, 1
เอาต์พุต
1