Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมค้นหา triplet nums[i]

สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums เราต้องตรวจสอบว่ามีแฝดสาม (i, j, k) ที่ i

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[2, 12, 1, 4, 4] ผลลัพธ์จะเป็น True เนื่องจาก [2, 12, 4] ตรงกับเกณฑ์เพราะ 2 <4 <12

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • n :=ขนาดของ nums

  • กำหนดอาร์เรย์ด้านซ้ายของขนาด n

  • ซ้าย[0] :=nums[0]

  • สำหรับการเริ่มต้น i :=1 เมื่อฉัน

    • left[i] :=ขั้นต่ำ nums[i] และ left[i - 1]

  • กำหนดหนึ่งสแต็ก st

  • สำหรับการเริ่มต้น i :=n - 1 เมื่อ i>=1 อัปเดต (ลด i โดย 1) ทำ -

    • x :=left[i - 1]

    • ในขณะที่ st ไม่ว่างและอยู่ด้านบนของ st <=x ทำ −

      • ป๊อปจากเซนต์

    • ถ้า st ไม่ว่างเปล่าและ x ด้านบนของ st แล้ว −

      • คืนความจริง

    • ดัน nums[i] เข้า st

  • คืนค่าเท็จ

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool solve(vector<int>& nums) {
      int n = nums.size();
      vector<int> left(n);
      left[0] = nums[0];
      for (int i = 1; i < n; i++) {
         left[i] = min(nums[i], left[i - 1]);
      }
      stack<int> st;
      for (int i = n - 1; i >= 1; i--) {
         int x = left[i - 1];
         while (!st.empty() && st.top() <= x)
            st.pop();
         if (!st.empty() && x < nums[i] && nums[i] > st.top())
            return true;
         st.push(nums[i]);
      }
      return false;
   }
};
bool solve(vector<int>& nums) {
   return (new Solution())->solve(nums);
}
int main(){
   vector<int> v = {2, 12, 1, 4, 4};
   cout << solve(v);
}

อินพุต

{2, 12, 1, 4, 4}

ผลลัพธ์

1