สมมติว่ามีสวนหนึ่งมิติบนแกน x ตำแหน่งเริ่มต้นของสวนคือ 0 และตำแหน่งสิ้นสุดคือ n มี n + 1 ก๊อกตั้งอยู่ที่จุด [0, 1, ..., n] ในสวน หากเรามีช่วงอาร์เรย์จำนวนเต็ม n และอาร์เรย์จำนวนเต็มของความยาว n + 1 โดยที่ ranges[i] คือก๊อกที่ i สามารถเติมพื้นที่ [i - ranges[i], i + ranges[i]] เมื่อพื้นที่นั้นอยู่ เปิดค่ะ
เราต้องหาจำนวนก๊อกขั้นต่ำที่ควรเปิดให้รดน้ำทั้งสวน หากไม่มีวิธีแก้ปัญหาก็ให้คืนค่า -1
ดังนั้นหากอินพุตเป็น n =5 และ ranges =[3,4,1,1,1,0] เอาต์พุตจะเป็น 1 เนื่องจากจากการแตะครั้งที่สองจะครอบคลุมทั้งพื้น [-3 ถึง 5].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดขนาดอาร์เรย์ v (n + 1) และเติมด้วย -1
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
u :=สูงสุดของ i - ranges[i] และ 0
-
e :=ขั้นต่ำของ n และ i + ranges[i]
-
v[u] :=สูงสุดของ v[u] และ e
-
-
ถ้า v[0] เหมือนกับ -1 แล้ว −
-
กลับ -1
-
-
สกุลเงิน :=v[0]
-
ผม :=0, ต่อไป :=0
-
ในขณะที่ curr
-
ในขณะที่ฉัน <=curr ทำ -
-
next :=สูงสุดของ next และ v[i]
-
(เพิ่ม i ขึ้น 1)
-
-
ถ้า next เหมือนกับ curr แล้ว −
-
กลับ -1
-
-
curr :=ต่อไป
-
(เพิ่มการถอยกลับโดย 1)
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minTaps(int n, vector<int>& ranges) {
int ret = 1;
vector<int> v(n + 1, -1);
for (int i = 0; i <= n; i++) {
int u = max(i - ranges[i], 0);
int e = min(n, i + ranges[i]);
v[u] = max(v[u], e);
}
if (v[0] == -1)
return -1;
int curr = v[0];
int i = 0;
int next = 0;
while (curr < n) {
while (i <= curr) {
next = max(next, v[i]);
i++;
}
if (next == curr)
return -1;
curr = next;
ret++;
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {3,4,1,1,1,0};
cout << (ob.minTaps(5, v));
} อินพุต
5, {3,4,1,1,1,0} ผลลัพธ์
1