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

Subarray ต่อเนื่องที่ยาวที่สุดพร้อมส่วนต่างแบบสัมบูรณ์น้อยกว่าหรือเท่ากับขีดจำกัดใน C++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่เรียกว่า nums และขีดจำกัดจำนวนเต็ม เราต้องหาขนาดของอาร์เรย์ย่อยที่ไม่ว่างเปล่าที่ยาวที่สุด เพื่อให้ผลต่างระหว่างสองรายการใดๆ ของอาร์เรย์ย่อยนี้น้อยกว่าหรือเท่ากับขีดจำกัดที่กำหนด

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[8,2,4,7], จำกัด =4 เอาต์พุตจะเป็น 2 นั่นเป็นเพราะ −

  • [8] ดังนั้น |8-8| =0 <=4.

  • [8,2] ดังนั้น |8-2| =6> 4.

  • [8,2,4] ดังนั้น |8-2| =6> 4.

  • [8,2,4,7] ดังนั้น |8-2| =6> 4.

  • [2] ดังนั้น |2-2| =0 <=4.

  • [2,4] ดังนั้น |2-4| =2 <=4.

  • [2,4,7] ดังนั้น |2-7| =5> 4.

  • [4] ดังนั้น |4-4| =0 <=4.

  • [4,7] ดังนั้น |4-7| =3 <=4.

  • [7] ดังนั้น |7-7| =0 <=4.

สุดท้าย ขนาดของ subarray ที่ยาวที่สุดคือ 2

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

  • ret :=0, i :=0, j :=0

  • กำหนดหนึ่ง deque maxD และอีกหนึ่ง deque minD

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

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

    • ในขณะที่ (ไม่ใช่ maxD ว่างเปล่าและองค์ประกอบสุดท้ายของ maxD

      • ลบองค์ประกอบสุดท้ายออกจาก maxD

    • ในขณะที่ (ไม่ใช่ minD ว่างเปล่าและองค์ประกอบสุดท้ายของ minD> nums[i]) ทำ -

      • ลบองค์ประกอบสุดท้ายออกจาก minD

    • ใส่ nums[i] ต่อท้าย maxD

    • ใส่ nums[i] ต่อท้าย minD

    • ในขณะที่ (องค์ประกอบแรกของ maxD - องค์ประกอบแรกของ minD)> k ทำ -

      • ถ้า nums[j] เหมือนกับองค์ประกอบแรกของ maxD แล้ว−

        • ลบองค์ประกอบด้านหน้าออกจาก maxD

      • ถ้า nums[j] เหมือนกับองค์ประกอบแรกของ minD แล้ว −

        • ลบองค์ประกอบด้านหน้าออกจาก minD

      • (เพิ่มขึ้น j โดย 1)

    • ret :=สูงสุดของ ret และ (i - j + 1)

  • รีเทิร์น

ตัวอย่าง

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int longestSubarray(vector<int>& nums, int k) {
      int ret = 0;
      int i = 0;
      int j = 0;
      deque<int> maxD;
      deque<int> minD;
      int n = nums.size();
      for (int i = 0; i < n; i++) {
         while (!maxD.empty() && maxD.back() < nums[i])
            maxD.pop_back();
         while (!minD.empty() && minD.back() > nums[i])
            minD.pop_back();
         maxD.push_back(nums[i]);
         minD.push_back(nums[i]);
         while (maxD.front() - minD.front() > k) {
            if (nums[j] == maxD.front())
               maxD.pop_front();
            if (nums[j] == minD.front())
               minD.pop_front();
            j++;
         }
         ret = max(ret, i - j + 1);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {7,8,2,4};
   cout << (ob.longestSubarray(v, 4));
}

อินพุต

{7,8,2,4}, 4

ผลลัพธ์

2