สมมติว่าเรามีอาร์เรย์แบบวงกลม (องค์ประกอบถัดไปขององค์ประกอบสุดท้ายคือองค์ประกอบแรกของอาร์เรย์) เราต้องแสดงจำนวนที่มากกว่าถัดไปสำหรับทุกองค์ประกอบ ในที่นี้ จำนวนที่มากกว่าเดิมของจำนวน x เป็นจำนวนที่มากกว่าตัวแรกของลำดับการเคลื่อนที่ถัดไปในอาร์เรย์ ซึ่งหมายความว่าเราสามารถค้นหาแบบวงกลมเพื่อหาจำนวนที่มากกว่าถัดไป หากไม่มีอยู่ ก็จะเป็น -1 ดังนั้นหากตัวเลขเป็น [1, 2, 1, 3, 2, 1] ผลลัพธ์จะเป็น:[2,3,3,-1,3,2]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของอาร์เรย์
- กำหนดหนึ่งอาร์เรย์ที่เรียกว่า res ขนาด n และเติมด้วย -1 กำหนดหนึ่งสแต็ก st
- สำหรับฉันอยู่ในช่วง 0 ถึง 2n
- ดัชนี :=ฉัน mod n, x :=nums[ดัชนี]
- ในขณะที่ st ไม่ว่างเปล่าและ nums[top of stack]
- res[บนสุดของสแต็ก] :=x
- ลบองค์ประกอบด้านบนออกจากสแต็ก
- แทรกดัชนีลงในสแต็ก
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n = nums.size(); vector <int> res(n, - 1); stack <int> st; for(int i = 0; i < 2 * n; i++){ int idx = i % n; int x = nums[idx]; while(!st.empty() && nums[st.top()] < x){ res[st.top()] = x; st.pop(); } st.push(idx); } return res; } }; main(){ Solution ob; vector<int> v = {1,2,1,3,2,1}; print_vector(ob.nextGreaterElements(v)); }
อินพุต
[1,2,1,3,2,1]
ผลลัพธ์
[2,3,3,-1,3,2]