优先级队列是啥呢?
简单来说 就是一个数组长度为k
往里面放一个元素, 依然能按照从小打到的距离排序
代码逻辑就是这样:
while(k > 0){
int temp = 0;
if(nums[numsSize-1]%3 > 0){
temp = 1;
}
nums[numsSize-1] /= 3;
nums[numsSize-1] += temp;
int topnum = nums[numsSize-1];
int top = numsSize-2;
while(top >= 0 && nums[top] > topnum){
nums[top+1] = nums[top];
top--;
}
nums[top+1] = topnum;
k--;
}
但这样写,复杂度会很大(俩while),因此出现了一个非常牛逼的算法----大根堆
void swap(int* nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
void down(int* nums,int size,int i){
for(int k = 2*i +1;k<size;k=2*k+1){
//父节点(k-1)/2, 左节点k,右节点k+1
if(k + 1 < size && nums[k] < nums[k+1]){
k++;
}
if(nums[k] < nums[(k-1)/2]){
break;
}
swap(nums,k,(k-1)/2);
}
}
void Init(int *nums, int size) {
for (int i = size / 2 - 1; i >= 0; i--) {
down(nums, size, i);
}
}
void Push(int *nums, int size, int x) {
nums[size] = x;
for (int i = size; i > 0 && nums[(i - 1) / 2] < nums[i]; i = (i - 1) / 2) {
swap(nums, i, (i - 1) / 2);
}
}
int Pop(int *nums, int size) {
swap(nums, 0, size - 1);
down(nums, size - 1, 0);
return nums[size - 1];
}
板子如上所示:其实思想很简单,down就是对一个数组的排序,利用树的结点思想来进行排序。