#Java,
#LeetCode
Problem
Given a non-empty array of integers, return the k most frequent elements.
Example 1
1
2
| Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
|
Example 2
1
2
| Input: nums = [1], k = 1
Output: [1]
|
Note
- You may assume
k is always valid, number of unique elements.
- Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
My Answer
nums를 정렬하자.
nums를 순회하면서, 마지막 확인 했던 값과 다른값이거나 마지막 값일 경우에 결과리스트에 어떻게 넣을지 확인하자.
- 너무 복잡하다. 좀 더 간단하게 풀어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> hashmap = new HashMap<>();
List<Integer> result = new ArrayList<>();
Arrays.sort(nums);
int last_checked_number = nums[0];
for(int idx=0; idx < nums.length; idx++) {
int n = nums[idx];
hashmap.put(n, hashmap.getOrDefault(n, 0) + 1);
if ( last_checked_number != n || idx == nums.length-1) {
int size = result.size();
int frequent = hashmap.get(last_checked_number);
int target_idx=-1;
for(int i = size-1; i>= 0; i--) {
int prev_freqent = hashmap.get(result.get(i));
if ( prev_freqent > frequent )
break;
target_idx = i;
}
if ( target_idx >= 0 ) {
result.add(target_idx, last_checked_number);
} else if ( size < k ) {
result.add(last_checked_number);
}
last_checked_number = n;
}
}
if ( result.size() < k ) {
result.add(last_checked_number);
}
return result.subList(0, k);
}
}
|