class solution {
public int[] kSmallest(int[] array, int k) {
heapify(array); // 把你给我的array变成一个heap
// 你heap完没有按顺序啊,所以我每次只能拿出来在最前面的那个
// 所以后面每一步,我需要从第0个,一个个percolateDown,确保从第0个到第k-1个都是排好序的
for (int i = 0 ; i < array.length; i++) {
swap(array, 0, array.length - 1 - i);//这一步意味着倒数第i个元素已经完成了排序
// 接下来调整0到array.length - 1 - i
percolateDown(array, 0, array.length - 1 - i);
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = array[i];
}
}
private void heapify(int[] arr) {
for (int i = arr.length/ 2 - i ; i >= 0; i--) {
percolateDown(arr, i, arr.length);
}
}
private void swap (int[] arr, int i , int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private void percolateDown(int[] array, int index, int size) {
while ( 2* index + 2 <= size) {
int leftChild = 2 * index + 1;
int rightChild = 2 * index + 2;
int candidateChild = leftChild;
if (rightChild <= size && array[rightChild] > array[leftChild]) {
candidateChild = rightChild;
}
if (array[index] > array[candidateChild]){
swap(array, index, candidateChild);
} else{
break;
}
index = candidateChild;
}
}
}
public int[] kSmallest(int[] array, int k) {
PriorityQueue<Integer> minHeap = new ArrayQueue<>();
for (int num: array) {
minHeap.offer(num);
}
int[] result = new int[Math.min(minHeap.size()),k];
for(int i = 0; i < result.length; i++) {
result[i] = minHeap.poll();
}
return result;
}
public class Solution {
public int[] kSmallest(int[] array, int k) {
// Write your solution here
// sanity check
if (array == null || array.length == 0 || k <=0) {
return new int[]{};
}
// build the minheap
heapify(array, 0, array.length - 1);
// poll k smallest element out
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = array[0];
swap(array, 0, array.length - i - 1);
percolateDown(array, 0, array.length - i - 1);// 下一次少了一个
}
return result;
}
private void swap(int[] array, int left, int right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
private void heapify(int[] array, int left, int right) {
int size = right - left + 1;
for (int i = size /2 - 1; i >= 0; i--) {
percolateDown(array, i, size);
}
}
private void percolateDown(int[] array, int index, int size) {
while (index <= size / 2 - 1) {
int leftIndex = index * 2 + 1;
int rightIndex = index * 2 + 2;
int candIndex = leftIndex;
if (rightIndex < size && array[rightIndex] < array[leftIndex]) {
candIndex = rightIndex;
}
if (array[candIndex] < array[index]) {
swap(array, candIndex, index);
} else {
break;
}
index = candIndex;
}
}
}
public class KSmallest{
public int[] kSmallest(int[] array, int k) {
// sanity check
if (array.length == 0 || k == 0) {
return new int[]{0};
}
// build the pq
//PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k , new Comparator<Integer>() {
//@Override
//public int compare(Integer o1, Integer o2) {
//if (o1.equals(o2) {
//return 0;
//}
//return o1 > o2 ? -1: 1;
//}
//})
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collection.reverseOrder());
// offer pq in and poll when pq.size() > k
//for (int i = 0; i < array.length; i++) {
//if (i < k) {
// maxHeap.offer(array[i]);
//}
//else if (array[i] < maxHeap.peek()) {
//maxHeap.poll();
//maxHeap.offer(array[i]);
//}
//}
for (int i = 0; i < array.length; i++) {
maxHeap.offer(array[i]);
if (maxHeap.size() > k) {
maxHeap.poll();
}
}
// post processing return all result
int[] result = new int[k];
for (int i = k -1; i >= 0; i--) {
result[i] = maxHeap.poll();
}
return result;
}
}
public int[] kSmallest(int[] array, int k) {
heapify(array, 0 , k -1);
// step 1: build the similuated heap in [0, k- 1]
// step 2: try to find the good candidate if array[new] < array[0]
// swap, percolatedDown
for (int i = k; i < array.length; i++) {
if (array[i] < array[0]) { // new candidate is better the worst one
swap(array, 0, i);
percolateDown(array, 0, i);
}
}
// step 3:
// get the result out from small to large
// 你应该每次都是从0th拿出来,但是还是需要percolateDown
int[] result = new int[k];
for (i = k - 1; i >= 0; i--) { //注意第一个已经先拿出来,所以一共是k个
result[i] = array[0];
swap(array, 0, i);
percolateDown(array, 0, i);
}
return result;
}
private void swap(int[] array, int i, int j) {
int temp = int[i];
int[i] = int[j];
int[j] = temp;
}
private void percolateDown(int[] array, int index, int size) {
while (index * 2 + 2 < size) {
int leftChild = index * 2 + 1;
int rightChild = index * 2 +2;
int candidate = leftChild;
if (rightChild < size && array[rightChild] > array[leftChild]) {
candidate = rightChild;
}
if (array[candiate] > array[index]) {
swap(array, candidate, index);
}
else {
break;
}
index = candidate;
}
}
private void heapify(int[] array, int left, int right) {
int size = right - left + 1;
for (int i = size / 2 - 1; i >= 0; i--) { [left, left + size/ 2 - 1]
percolateDown(arr, i, size);
}
}