Subarray เรียกว่า "ภูเขา" (mountain) ถ้า:
- ความยาว ≥ 3
- มีจุดสูงสุด (peak) ที่เพิ่มขึ้นอย่างเคร่งครัดถึงจุดนั้น แล้วลดลงอย่างเคร่งครัดหลังจุดนั้น
ตัวอย่าง
Input − [2,1,4,7,3,2,5] Output − 5
คำอธิบาย − ภูเขาที่ยาวที่สุด: [1,4,7,3,2] ความยาว 5
แนวทางการแก้ปัญหา (Two Pointers)
- วนหาจุดเริ่มต้นของภูเขา (ขึ้นก่อน)
- ขยับ j ไปข้างหน้าขณะขึ้น (up = true)
- ต่อขยับ j ขณะลง (down = true)
- ถ้ามีทั้ง up และ down → อัปเดตคำตอบ max(j-i+1)
- ข้ามไปจุดสิ้นสุดของภูเขานี้ (i = j+1)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int longestMountain(vector& a) {
int n = a.size(), ans = 0;
for (int i = 0; i < n; ) {
int j = i;
bool up = false, down = false;
while (j + 1 < n && a[j+1] > a[j]) { up = true; j++; }
while (up && j + 1 < n && a[j+1] < a[j]) { down = true; j++; }
if (up && down) {
ans = max(ans, j - i + 1);
j--; // overlap next start
}
i = j + 1;
}
return ans;
}
};
int main() {
vector v = {2,1,4,7,3,2,5};
Solution ob;
cout << ob.longestMountain(v); // 5
return 0;
}
ผลลัพธ์
5
บทความนี้แก้ปัญหา Longest Mountain in Array (LeetCode 845) โดยใช้ Two Pointers 掃อาร์เรย์หาลำดับขึ้น-ลงที่ยาวที่สุด O(n) time O(1) space