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

โปรแกรมตรวจสอบรายการสามารถแบ่งออกเป็นรายการย่อยขององค์ประกอบที่เพิ่มขึ้น k ใน C++


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และอีกจำนวนหนึ่งคือ k เราต้องตรวจสอบว่ารายการสามารถแบ่งออกเป็นรายการได้หรือไม่ โดยแต่ละรายการมีค่า k และค่าต่างๆ เพิ่มขึ้นอย่างต่อเนื่อง

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[4, 3, 2, 4, 5, 6], k =3 ผลลัพธ์จะเป็น True เนื่องจากเราสามารถแบ่งรายการออกเป็น [2, 3, 4] และ [ 4, 5, 6]

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

  • กำหนดหนึ่งแผนที่

  • สำหรับแต่ละคีย์ใน m

    • เพิ่ม m[it] ขึ้น 1

  • โอเค :=จริง

  • ในขณะที่ (ขนาดของ m ไม่ใช่ 0 และ ok เป็นจริง) ทำ -

    • โอเค :=เท็จ

    • สำหรับแต่ละคีย์-ค่าจับคู่ในหน่วย m

      • ถ้า (it.key - 1) ไม่อยู่ในหน่วย m แล้ว −

        • ธง :=จริง

        • สำหรับการเริ่มต้น i :=it.key เมื่อฉัน <=it.key + k - 1 อัปเดต (เพิ่ม i ขึ้น 1) ทำ -

          • ถ้าฉันไม่มีอยู่ใน m แล้ว −

            • ธง :=เท็จ

        • ถ้าแฟล็กเป็นจริง −

          • สำหรับการเริ่มต้น i :=it.key เมื่อฉัน <=it.key + k - 1 อัปเดต (เพิ่ม iby 1) ทำ -

            • (ลด m[i] ลง 1)

            • ถ้า m[i] เท่ากับ 0 แล้ว −

              • ลบฉันออกจาก m

          • โอเค :=จริง

          • ออกจากวง

  • คืนค่า จริง เมื่อ m ว่างเปล่า มิฉะนั้น เท็จ

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

ตัวอย่าง

#include<bits/stdc++.h>
using namespace std;
class Solution {
   public:
      bool solve(vector<int> nums, int k) {
         map <int, int> m;
         for(auto& it : nums){
            m[it]++;
         }
         bool ok = true;
         while(m.size() && ok){
            ok = false;
            for(auto& it : m){
               if(!m.count(it.first - 1)){
                  bool flag = true;
                  for(int i = it.first; i <= it.first + k - 1;i++){
                     if(!m.count(i))
                        flag = false;
                     }
                     if(flag){
                        for(int i = it.first; i <= it.first + k - 1;i++){
                           m[i]--;
                           if(m[i] == 0)
                              m.erase(i);

                     }
                     ok = true;
                     break;
                  }
               }
            }
         }
         return m.empty();
      }
};
main(){
   vector<int> v = {4, 3, 2, 4, 5, 6};
   Solution ob;
   cout << ob.solve(v, 3);
}

อินพุต

{4, 3, 2, 4, 5, 6}

ผลลัพธ์

1