มีรถ N คันเดินทางไปจุดหมายระยะ target ไมล์ รถแต่ละคันมีตำแหน่งเริ่มต้น position[i] และความเร็ว speed[i] รถไม่สามารถแซงกันได้ จะขับติดกันเป็นฝูง (fleet) หาจำนวน fleet ที่ถึงจุดหมาย
ตัวอย่าง
Input − target=12, pos=[10,8,0,5,3], speed=[2,4,1,1,3] Output − 3
คำอธิบาย − รถที่ 10 และ 8 รวมเป็น fleet ที่ 12, รถที่ 0 เดินคนเดียว, รถที่ 5 และ 3 รวมเป็น fleet ที่ 6
แนวทางการแก้ปัญหา
- จับคู่ (position, speed) เรียงตามตำแหน่งจากใกล้จุดหมายไปไกล
- คำนวณเวลาที่แต่ละรถใช้ถึงจุดหมาย: (target - pos) / speed
- ใช้ stack: ถ้ารถถัดไปใช้เวลา ≤ รถหน้า (เร็วกว่าหรือเท่ากัน) จะรวมเป็น fleet เดียวกัน (pop stack)
- จำนวน fleet = ขนาด stack สุดท้าย
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int carFleet(int target, vector& pos, vector& speed) {
vector> cars;
int n = pos.size();
for (int i = 0; i < n; i++)
cars.push_back({pos[i], speed[i]});
sort(cars.begin(), cars.end());
stack st;
for (int i = n - 1; i >= 0; i--) {
double time = (target - cars[i].first) / cars[i].second;
if (st.empty() || time > st.top())
st.push(time);
}
return st.size();
}
};
int main() {
vector pos = {10, 8, 0, 5, 3};
vector speed = {2, 4, 1, 1, 3};
Solution ob;
cout << ob.carFleet(12, pos, speed); // 3
return 0;
}
ผลลัพธ์
3
บทความนี้แก้ปัญหา Car Fleet (LeetCode 853) โดยคำนวณเวลาถึงเป้าหมาย เรียงตามตำแหน่ง และใช้ Stack รวมรถที่เร็วกว่าจะชนรถหน้าเป็น fleet เดียวกัน