研究生畢業前一日三題:2,列印幾個陣列 ,前面最大的K個元素
阿新 • • 發佈:2018-12-21
//列印幾個陣列中,前面最大的K個數字 class PrintMaxTopK { class HeadNode { public: int value;//結點的數值 int arrNum;//當前是第幾個陣列 int index;//陣列的第幾個下標 HeadNode(int x,int y,int z):value(x),arrNum(y),index(z) {} }; public: void printTopK(vector <vector <int > >& matrix,int TopK) { int heapSize = matrix.size(); //********************************//建立新節點!!!!!!!!!!!!!!!!!111 HeadNode *heap[3]; /*for(int i=0;i<heapSize;i++) { heap[i]= new HeadNode(0,0,0); }*/ //******************************** for(int i=0;i < heapSize;i++) { int index = matrix[i].size()-1; heap[i] = new HeadNode( matrix[i][index], i, index ); heapInsert(heap, i); //cout<<heap[i]->arrNum<<heap[i]->index<<heap[i]->value<<endl; } for(int i=0;i!=TopK;i++) { if(heapSize==0) break; cout<<heap[0]->value; if(heap[0]->index !=0 ) { heap[0]->value = matrix[heap[0]->arrNum][--heap[0]->index]; } else { swap(heap[0],heap[--heapSize]); } heapify(heap,0,heapSize);///第二個引數為堆的大小 } } void heapify(HeadNode *heap[],int left,int heapSize)///第二個引數為堆的大小 { int Lchild = left*2+1; while( Lchild < heapSize) { int largest = Lchild+1 < heapSize && heap[Lchild]->value < heap[Lchild+1]->value ? Lchild+1 : Lchild; largest = heap[left]->value < heap[largest]->value ? largest:left; if(largest == left) break; swap(heap[left],heap[largest]); left=largest; Lchild = left*2+1; } } void heapInsert(HeadNode *heap[], int i) { while(heap[(i-1)/2]->value < heap[i]->value) { swap(heap[(i-1)/2] , heap[i]); i=(i-1)/2; } } }; //列印幾個陣列中,前面最大的K個數字
這個題目著實的很吊。記憶深刻的heapinsrt,heapify,,指望這個堆排序的基本知識,過了華為面試,著實記憶深刻。。一個博學的大牛氣質的工程師,給我丟擲堆排序,用了三行程式碼,實現了heapinsert,程式碼簡潔實用,很展現基本功