문제
리스트에서 k번째로 작은 값을 반환하세요 (k는 1부터 셉니다). Quickselect 알고리즘을 사용하면 전체를 정렬하지 않고 평균 O(n) 시간에 찾을 수 있습니다.
kth_smallest(numbers, k)를 구현하세요.
입력
numbers: 정수로 이루어진 리스트입니다. k: 반환할 작은 값의 순서(1부터 시작).
출력
k번째로 작은 값을 반환하세요.
제약 조건
1 ≤ k ≤ 길이 ≤ 200,000
예시
예시 1
입력:
k = 3
numbers = [7, 10, 4, 3, 20, 15]
예상 출력:
expected = 7
입력:
long long k = 3;
std::vector<long long> numbers = {7, 10, 4, 3, 20, 15};
예상 출력:
long long expected = 7;
입력:
long k = 3;
long[] numbers = new long[] {7, 10, 4, 3, 20, 15};
예상 출력:
long expected = 7;
설명
정렬 결과: 3, 4, 7, 10, 15, 20; 3번째로 작은 값은 7입니다.
예시 2
입력:
k = 2
numbers = [5, 5, 1]
예상 출력:
expected = 5
입력:
long long k = 2;
std::vector<long long> numbers = {5, 5, 1};
예상 출력:
long long expected = 5;
입력:
long k = 2;
long[] numbers = new long[] {5, 5, 1};
예상 출력:
long expected = 5;
설명
정렬 결과: 1, 5, 5; 2번째로 작은 값은 5입니다 (중복도 개수에 포함).
접근 방법
먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.
힌트 1
정렬했을 때 k번째 자리에 들어갈 원소만 필요하고, 전체 정렬 결과는 필요 없습니다.
힌트 2
피벗을 기준으로 분할한 뒤, 목표 순위를 포함할 수 있는 쪽만 재귀 또는 반복으로 들어가세요.
힌트 3
k는 1부터 시작한다는 점과, 중복값도 각각 별도의 위치로 세어야 한다는 점을 기억하세요.
예상 복잡도
O(n) average time, O(1) extra space
참고 자료
이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.