그룹 K의 큰 수를 쌓아서 구하기
2704 단어 배열
지난 블로그에서 O(n)[명사도], ansjsun 학생은 매우 가치 있는 답장을 남겼다.
ansjsun
코드를 대충 봤는데...
이렇게 해서...사실 답은 쌓여가지고...
두 번째는 O (2*logn) = O (n)
ansjsun이 제공한 사고방식에 감사 드립니다. 다음은 제가 실현한 코드입니다.
import java.util.Arrays;
public class MaxHeap {
private int[] array;
private int size;
public MaxHeap(int[] array){
this.array = Arrays.copyOf(array, array.length);
this.size = this.array.length;
}
// K
public int kmax(int k){
if(k<1 || k>size){
throw new IllegalArgumentException("k must be between 1 and " + size);
}
this.buildMaxHeap();
for(int count=1,i=size-1;i>=1;i--,count++){
if(k == count){
break;
}
swap(0,i);
maxHeapify(0,i);
}
return array[0];
}
//
public void buildMaxHeap(){
for(int i=parent(size-1);i>=0;i--){
maxHeapify(i,size);
}
}
//
public void sort(){
this.buildMaxHeap();
for(int i=size-1;i>=1;i--){
swap(i,0);
maxHeapify(0,i);
}
}
// i 。
//@param i
//@param size
private void maxHeapify(int i, int size){
int maxIndex = i;
int left = left(i);
int right = right(i);
if(left<size && array[left]>array[maxIndex]){
maxIndex = left;
}
if(right<size && array[right]>array[maxIndex]){
maxIndex = right;
}
if(maxIndex != i){
swap(i,maxIndex);
// ,
maxHeapify(maxIndex,size);
}
}
private void swap(int i,int j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
private int left(int i){
return (i<<1) + 1;
}
private int right(int i){
return (i<<1) + 2;
}
private int parent(int i){
return (i-1)>>1;
}
public void print(){
int i=0;
for(int width=1;;width*=2){
for(int count=0;count<width;count++){
System.out.print(array[i]+ " ");
i++;
if(i==size){
System.out.println();
return;
}
}
System.out.println();
}
}
public static void main(String[] args){
int[] a = new int[]{1,2,3,4,5};
MaxHeap heap = new MaxHeap(a);
//
System.out.println(heap.kmax(2));
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP 배열에서 요소의 값이 최대 값인 키 이름을 가져옵니다.Qiita 에 " "@ PHP 매뉴얼 데이터 최대값이 나타나는 순서대로 획득 결과 키를 정렬한 후 가져오기 결과 @ paiza.IO PHP v5.6.40, v7.1.33, v7.4.4 " "@ StackOverflo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.