leetcode 검 은 offer 면접 문제 40. 최소 k 개 수 를 가리킨다.
원제 링크
제목.
정수 배열 arr 를 입력 하여 가장 작은 k 개 수 를 찾 아 보 세 요.예 를 들 어 4, 5, 1, 6, 2, 7, 3, 8 이라는 8 개의 숫자 를 입력 하면 가장 작은 4 개의 숫자 는 1, 2, 3, 4 이다.
예시 1:
입력: arr = [3, 2, 1], k = 2 출력: [1, 2] 또는 [2, 1]
예시 2:
입력: arr = [0, 1, 2, 1], k = 1 출력: [0]
제한:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
문제 풀이 방향: 최대 더미
이 문 제 는 가장 많은 사상 으로 길이 가 k 인 최대 배열 을 유지 할 수 있 습 니 다. 만약 에 새로운 요소 가 최대 쌓 인 요소 보다 크 면 현재 의 새로운 요 소 를 쌓 인 요소 와 교환 한 다음 에 쌓 인 유지 (즉, 가장 많은 성질 유지) 를 할 수 있 습 니 다. 유지 과정 은 쌓 인 지붕 에서 시작 하여 서브 노드 에 현재 요소 보다 큰 값 이 존재 하면 서브 노드 와 현재 요 소 를 교환 합 니 다.현재 요소 인덱스 값 을 교환 서브 노드 인덱스 로 지정 합 니 다. 잎 노드 를 만 나 거나 현재 요소 보다 큰 하위 노드 가 없 으 면 순환 이 끝 납 니 다.
vector<int> getLeastNumbers(vector<int>& arr, int k) {
// or k==0
if(k==0||arr.empty()) return vector<int>();
//
vector<int> ans(k,INT_MAX);
for(int x:arr){
// , k
if(x<ans[0]){
//
ans[0]=x;
//
maintain_heap(ans);
}
}
return ans;
}
//
void maintain_heap(vector<int>& ans){
int i=0;
while(i<ans.size()){
// , , , 。
if((2*i+1)>=ans.size()) break;
int left=ans[2*i+1];
//max_num
int max_num=left;
//
if((2*i+2)<ans.size()){
int right=ans[2*i+2];
max_num=left>right?left:right;
//
if(ans[i]<max_num){
if(left>right){
//
swap(ans[i],ans[2*i+1]);
i=2*i+1;
}else{
swap(ans[i],ans[2*i+2]);
i=2*i+2;
}
}
else{
// ,
break;
}
}
else{
//
if(ans[i]<max_num){
// ,
swap(ans[i],ans[2*i+1]);
i=2*i+1;
}
else break;// ,
}
}
}
void swap(int& x,int& y){
int t=x;
x=y;
y=t;
}
cpp 의 stl 용기 priorityqueue 우선 대기 열 에서 도 최대 수 요 를 빠르게 완성 할 수 있 습 니 다.
알고리즘 시간 복잡 도 O (nlogk), 공간 복잡 도 O (k).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.