현재 탐색하고 있는 순열의 다음 순열을 구하고 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)이다.
'Old > 복습' 카테고리의 다른 글
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 |