Metaverse/복습

STL - next_permutation

onenewkong 2024. 2. 1. 01:39

현재 탐색하고 있는 순열의 다음 순열을 구하고 true를 반환한다. 만약, 다음 순열이 존재하지 않는다면 false를 반환한다.

즉, 마지막 모든 순열의 경우의 수를 탐색한 뒤, false를 반환한다.

 

template<class BidirIt>
bool next_permutation(BidirIt first, BidirIt last)
{
    auto r_first = std::make_reverse_iterator(last);
    auto r_last = std::make_reverse_iterator(first);
    auto left = std::is_sorted_until(r_first, r_last);
 
    if (left != r_last)
    {
        auto right = std::upper_bound(r_first, left, *left);
        std::iter_swap(left, right);
    }
 
    std::reverse(left.base(), last);
    return left != r_last;
}

 

Time Complexity

비교를 진행하면서, N/2만큼 swap을 진행한다. 이때, N = std::distance(first, last)이다.

즉, 시간 복잡도는 O(N)이다.

 

'Metaverse > 복습' 카테고리의 다른 글

STL - set  (0) 2024.01.30
STL - sort  (0) 2024.01.18
STL - max_element와 min_element  (0) 2024.01.18
C++ - 복사 생성자  (1) 2024.01.03
C++ - 범위 기반 for문  (1) 2024.01.03