Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

목록이 C++에서 k 증가 요소의 하위 목록으로 분할될 수 있는지 확인하는 프로그램

<시간/>

nums라는 숫자 목록이 있고 또 다른 숫자 k가 있다고 가정하고 각 목록에 k 값이 포함되어 있고 값이 연속적으로 증가하는 목록으로 분할할 수 있는지 확인해야 합니다.

따라서 입력이 nums =[4, 3, 2, 4, 5, 6], k =3과 같으면 목록을 [2, 3, 4] 및 [ 4, 5, 6]

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 하나의 지도 정의

  • 각 키에 대해 m

    • m[it]을 1 증가

  • 확인 :=사실

  • 동안 (m의 크기는 0이 아니고 ok는 참임) −

    • 확인 :=거짓

    • 각 키-값 쌍에 대해 m

      • (it.key - 1)이 m에 없으면 -

        • 플래그 :=참

        • for initialize i :=it.key, i <=it.key + k - 1일 때 업데이트(i를 1만큼 증가), do -

          • i가 m에 없으면 -

            • 플래그 :=거짓

        • 플래그가 참이면 -

          • initialize i :=it.key 의 경우 i <=it.key + k - 1일 때 업데이트(i만큼 1 증가), −

            • (m[i]를 1만큼 감소)

            • m[i]가 0과 같으면 -

              • m에서 i 삭제

          • 확인 :=사실

          • 루프에서 나오세요

  • m이 비어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#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