React

347. Top K Frequent Elements

Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
Plain Text
복사
Example 2:
Input: nums = [1], k = 1 Output: [1]
Plain Text
복사
Constraints:
1 <= nums.length <= 105
k is in the range [1, the number of unique elements in the array].
It is guaranteed that the answer is unique.
Follow up: Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

My solution

정수 배열 nums와 k개 주어지면, 가장 자주 사용하는 k 개의 요소를 반환한다. 어떤 순서든 가능하다.
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
Docker
복사
k가 2이면 2개의 가장 자주 사용되는 요소를 반환한 것이다.
hash table을 사용하거나 map 객체를 사용해서 각 요소별로 개수를 센다.
완성된 해시테이블은 이차원 배열화하면 sort할 수 있게 된다.
sort만 하면 이제 key([0])만 map 메서드로 뽑아낸 배열을 만들 수 있다.
이렇게 만든 배열을 k개만큼만 잘라서 반환하면 된다.

Code

/** * @param {number[]} nums * @param {number} k * @return {number[]} */ const topKFrequent = function (nums, k) { // use a map const myMap = new Map(); for (const x of nums) { if (myMap.has(x)) { myMap.set(x, myMap.get(x) + 1); } else { myMap.set(x, 1); } } return [...myMap.entries()] .sort((a, b) => b[1] - a[1]) .map(v => v[0]) .slice(0, k); // use a hash table // const hash = {}; // for (const x of nums) { // if (hash[x]) { // hash[x]++; // } else { // hash[x] = 1; // } // } // return [...Object.entries(hash)] // .sort((a, b) => b[1] - a[1]) // .map(v => parseInt(v[0], 10)) // .slice(0, k); }; describe('topKFrequent', () => { it('TC1', () => { expect(topKFrequent([1, 1, 1, 2, 2, 3], 2)).toStrictEqual([1, 2]); }); it('TC2', () => { expect(topKFrequent([1], 1)).toStrictEqual([1]); }); it('TC3', () => { expect(topKFrequent([1, 2], 2)).toStrictEqual([1, 2]); }); it('TC4', () => { expect(topKFrequent([4, 1, -1, 2, -1, 2, 3], 2)).toStrictEqual([-1, 2]); }); });
JavaScript
복사