215. 数组中的第K个最大元素
1.题目描述及示例
- 题目描述
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 - 示例
2.题解思路及代码
- 思路
(1)这种题目最适合用堆排序,参考算法笔记的内容
(2)前期需要记录不同的数字出现的次数,但题中没有给出数的范围,不能用数组散列的方式,只能用map记录。 - 代码
class Node
{
int id;
int count;
public Node(int id,int count)
{
this.id=id;
this.count=count;
}
}
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer>map=new HashMap<Integer, Integer>();
for (int i=0;i<nums.length;i++)
{
if (map.get(nums[i])==null)
map.put(nums[i],1);
else
map.put(nums[i],map.get(nums[i])+1);
}
Node [] nodes=new Node[map.keySet().size()];
int ii=0;
for (Integer num:map.keySet())
{
nodes[ii]=new Node(num,map.get(num));
ii++;
}
int [] result =new int[k];
int length=map.keySet().size();
for (int i=length/2;i>=0;i--)
{
downAdjust(nodes,i,length-1);
}
for (int i=0;i<k;i++)
{
result[i]=nodes[0].id;
nodes[0]=nodes[length-1];
length--;
downAdjust(nodes,0,length-1);
}
return result;
}
public void downAdjust(Node []nodes,int low,int high)
{
int i=low,j=2*i+1;
while (j<=high)
{
if (j+1<=high&&nodes[j+1].count>nodes[j].count)
j++;
if (nodes[i].count<nodes[j].count)
{
Node temp=nodes[i];
nodes[i]=nodes[j];
nodes[j]=temp;
i=j;
j=2*i+1;
}
else
break;
}
}