พิจารณาใด ๆ (ต่อเนื่องกัน) subarray B (ของ A) ภูเขาที่เรียกว่าถ้าคุณสมบัติดังต่อไปนี้ถือ -
- ขนาด B>=3
- มีบาง 0 B[i+1]> ..> B[B.length - 1]
สมมติว่าเรามีอาร์เรย์ A ของจำนวนเต็ม เราต้องหาความยาวของภูเขาที่ยาวที่สุด เราต้องคืนค่า 0 หากไม่มีภูเขา ดังนั้นหากอินพุตเป็นเช่น [2,1,4,7,3,2,5] ผลลัพธ์จะเป็น 5 ดังนั้นภูเขาที่ใหญ่ที่สุดจะเป็น [1,4,7,3,2] ซึ่งมีความยาว 5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ret :=0, n :=ขนาดของอาร์เรย์ a
- i :=0 ถึง n – 1, เพิ่ม i โดย j + 1
- j :=ฉัน
- ลง :=เท็จ ขึ้น :=เท็จ
- ในขณะที่ j + 1
a[j] - up :=true และเพิ่ม j ขึ้น 1
- ขณะขึ้นเป็นจริงและ j + 1
a[j] - ลง :=true และเพิ่ม j ขึ้น 1
- ถ้าขึ้นและลงทั้งสองเป็นจริง ให้ตั้งค่า ret :=max ของ j – i + 1 และ ret ให้ลด j ขึ้น 1
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int longestMountain(vector<int>& a) { int ret = 0; int n = a.size(); int j; for(int i = 0; i < n; i = j + 1){ j = i; bool down = false; bool up = 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){ ret = max(j - i + 1, ret); j--; } } return ret; } }; main(){ vector<int> v = {2,1,4,7,3,2,5}; Solution ob; cout << (ob.longestMountain(v)); }
อินพุต
[2,1,4,7,3,2,5]
ผลลัพธ์
5