题目
You’re given an array a. You should repeat the following operation k times: find the minimum non-zero element in the array, print it, and then subtract it from all the non-zero elements of the array. If all the elements are 0s, just print 0.
Input
The first line contains integers n and k (1≤n,k≤10^5), the length of the array and the number of operations you should perform.
The second line contains n space-separated integers a1,a2,…,an (1≤ai≤10^9), the elements of the array.
Output
Print the minimum non-zero element before each operation in a new line.
Examples
input
3 5
1 2 3
output
1
1
1
0
0
input
4 2
10 3 5 3
output
3
2
Note
In the first sample:
In the first step: the array is [1,2,3], so the minimum non-zero element is 1.
In the second step: the array is [0,1,2], so the minimum non-zero element is 1.
In the third step: the array is [0,0,1], so the minimum non-zero element is 1.
In the fourth and fifth step: the array is [0,0,0], so we printed 0.
In the second sample:
In the first step: the array is [10,3,5,3], so the minimum non-zero element is 3.
In the second step: the array is [7,0,2,0], so the minimum non-zero element is 2.
题意:给一个长度为n的数组,操作k次,找到这个数组的最小值,并输出它,接下来的数组不为0的元素减去上一次最小的数,并输出最小值,如果数组全为0,则输出0
解题思路:本题,如果使用常规的排序方法,当数据非常多时,会导致时间超时,所以本题使用堆排序,将不为0的元素全存入到小根堆中,然后遍历小根堆,设置一个最小值变量count,每次获得小根堆中的最小数减去之前累加的最小值和所得不为0的值存入到一个长度为k的数组中。
注意:当遍历小根堆时,小根堆的数据元素会有可能大于数组的长度,所以增加数组长度控制语句,防止数组溢出。
AC–Code
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
import javax.swing.Box.Filler;
public class CF1088B {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] c = new int [k];
Arrays.fill(c, 0);
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
for(int i =0;i<n;i++)
{
int a = sc.nextInt();
if(a!=0)
{
minHeap.add(a);
}
}
int count = 0;
int f =0;
while(!minHeap.isEmpty())
{
int a = minHeap.poll()-count;
if(a!=0&&f<k)
{
c[f] = a;
f++;
count+= a;
}
}
for(int i =0;i<k;i++)
{
System.out.println(c[i]);
}
sc.close();
}
}