题目:
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
Example 2:
Input: nums = [1], k = 1 Output: [1]
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
分析:找出数组中前k多 的数
思路:需要用有序的map集合来存储,就想到了TreeMap,但是这个是基于key的排序,
而我的做法中key存的是数组中的元素,value存的是元素的个数
就希望能够按照value从大到小排序,取前k个就好了
就涉及两个问题:
1、怎么让TreeMap按照value从大到小排序?
https://blog.csdn.net/liuxiao723846/article/details/50454622
借助了这个博客里的内容:
TreeMap底层是根据红黑树的数据结构构建的,默认是根据key的自然排序来组织(比如integer的大小,String的字典排序)。所以,TreeMap只能根据key来排序,是不能根据value来排序的(否则key来排序根本就不能形成TreeMap)。
今天有个需求,就是要根据treeMap中的value排序。所以网上看了一下,大致的思路是把TreeMap的EntrySet转换成list,然后使用Collections.sor排序。代码:
//treeMap中的排序依然没变,变得只是装treeMap的Arraylist
public static void sortByValue() {
Map<String,String> map = new TreeMap<String,String>();
map.put("a", "dddd");
map.put("d", "aaaa");
map.put("b", "cccc");
map.put("c", "bbbb");
List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
for (Entry<String, String> e: list) {
System.out.println(e.getKey()+":"+e.getValue());
}
}
改到我这里面就是:
List<Map.Entry<Integer,Integer>> t_list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(t_list, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
//按照value的降序排列
if(o1.getValue()>o2.getValue()) return -1;
if(o1.getValue()==o2.getValue()) return 0;
return 1;
}
});
2、如果遍历TreeMap?
参考代码:
https://blog.csdn.net/qq_31024823/article/details/80203448
public class Eee {
public static void main(String[] args) {
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("s", 2);
treeMap.put("w", 3);
treeMap.put("d", 1);
treeMap.put("f", 0);
treeMap.put("h", 9);
treeMap.put("q", 11);
treeMap.put("a", 25);
//遍历1
System.out.println("======================遍历一========================");
Iterator<String> it1 = treeMap.keySet().iterator();
while(it1.hasNext()){
String key = it1.next();
Integer value = treeMap.get(key);
System.out.println("key=" + key + " ; " + "value=" + value);
}
//遍历二
System.out.println("======================遍历二========================");
Iterator<Entry<String, Integer>> it2 = treeMap.entrySet().iterator();
while(it2.hasNext()) {
Entry<String, Integer> entry = it2.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("key=" + key + " ; " + "value=" + value);
}
}
}
本题代码:
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> list = new ArrayList<Integer>();
Map<Integer,Integer> map = new TreeMap<Integer, Integer>();
for(int i = 0 ;i<nums.length;i++){
if(map.containsKey(nums[i])){
//如果map里面已经有了这个值,那么就加一
int count = map.get(nums[i]);
count ++;
map.put(nums[i],count);
}else {
//如果不存在就添加,并且把count 设置为1
map.put(nums[i],1);
}
}
List<Map.Entry<Integer,Integer>> t_list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(t_list, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
if(o1.getValue()>o2.getValue()) return -1;
if(o1.getValue()==o2.getValue()) return 0;
return 1;
}
});
int i = 0;
for(Map.Entry<Integer,Integer> e:t_list){
if(i<k) list.add(e.getKey());
else break;
i++;
//System.out.println(e.getKey()+":"+e.getValue());
}
return list;
}
}