สมมติว่าเรามีลำดับของตัวเลขที่เรียกว่าลำดับการแกว่ง ถ้าความแตกต่างระหว่างตัวเลขที่ต่อเนื่องกันสลับกันระหว่างค่าบวกและค่าลบอย่างเคร่งครัด ความแตกต่างแรกอาจเป็นบวกหรือลบ ลำดับที่มีองค์ประกอบน้อยกว่าสององค์ประกอบนั้นเป็นลำดับการกระดิกเล็กน้อย ตัวอย่างเช่น [1,7,4,9,2,5] เป็นลำดับการแกว่ง เพราะถ้าคุณเห็น ความแตกต่าง (6,-3,5,-7,3) จะเป็นบวกและลบสลับกัน แต่ [1,4,7,2,5] และ [1,7,4,5,5] ไม่ใช่ลำดับการกระดิก อันแรกเพราะความแตกต่างสองอันแรกเป็นค่าบวก และอันที่สองเพราะผลต่างสุดท้ายเป็นศูนย์ .
เรามีลำดับของจำนวนเต็ม เราต้องหาความยาวของลำดับย่อยที่ยาวที่สุด นั่นคือลำดับการแกว่ง ลำดับต่อมาได้มาจากการลบองค์ประกอบจำนวนหนึ่ง (ในท้ายที่สุดก็เท่ากับศูนย์ด้วย) ออกจากลำดับดั้งเดิม โดยปล่อยให้องค์ประกอบที่เหลืออยู่ในลำดับเดิม ดังนั้นหากอินพุตเป็น [1,7,4,9,2,5] เอาต์พุตจะเป็น 6 เนื่องจากลำดับทั้งหมดเป็นลำดับการกระดิก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ nums
-
ถ้า n เป็น 0 ให้คืนค่า 0
-
ตั้งค่า :=1 และลง :=1
-
สำหรับผมอยู่ในช่วง 1 ถึง n – 1
-
ถ้า nums[i]> nums[i – 1] แล้ว up :=down + 1
-
มิฉะนั้นเมื่อ nums[i]
-
-
ผลตอบแทนสูงสุดของขึ้นและลง
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int wiggleMaxLength(vector<int>& nums) { int n = nums.size(); if(!n) return 0; int up = 1; int down = 1; for(int i = 1; i < n; i++){ if(nums[i] > nums[i - 1]){ up = down + 1; } else if(nums[i] < nums[i - 1]){ down = up + 1; } } return max(up, down); } }; main(){ Solution ob; vector<int> v = {1,7,4,9,2,5}; cout << (ob.wiggleMaxLength(v)); }
อินพุต
[1,7,4,9,2,5]
ผลลัพธ์
6