diff --git a/LeetcodeProblems/Algorithms/Top_K_Frequent_Elements.js b/LeetcodeProblems/Algorithms/Top_K_Frequent_Elements.js new file mode 100644 index 0000000..5180f8c --- /dev/null +++ b/LeetcodeProblems/Algorithms/Top_K_Frequent_Elements.js @@ -0,0 +1,56 @@ +/* +Top K Frequent Elements +https://leetcode.com/problems/top-k-frequent-elements/description/ + +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] + + +Example 2: + +Input: nums = [1], k = 1 +Output: [1] + + +Constraints: + +1) 1 <= nums.length <= 10^5 +2) -10^4 <= nums[i] <= 10^4 +3) k is in the range [1, the number of unique elements in the array]. +4) It is guaranteed that the answer is unique. +*/ + +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ + var topKFrequent = function(nums, k) { + const freqMap = new Map(); + const bucket = []; + const result = []; + + for(let num of nums) { + freqMap.set(num, (freqMap.get(num) || 0) + 1); + } + + for(let [num, freq] of freqMap) { + bucket[freq] = (bucket[freq] || new Set()).add(num); + } + + for(let i = bucket.length-1; i >= 0; i--) { + if(bucket[i]) { + result.push(...bucket[i]); + if(result.length === k) break; + } + } + return result; +}; + +module.exports.topKFrequent = topKFrequent; diff --git a/LeetcodeProblemsTests/Algorithms/Top_K_Frequent_Elements_Test.js b/LeetcodeProblemsTests/Algorithms/Top_K_Frequent_Elements_Test.js new file mode 100644 index 0000000..5900f68 --- /dev/null +++ b/LeetcodeProblemsTests/Algorithms/Top_K_Frequent_Elements_Test.js @@ -0,0 +1,10 @@ +const assert = require('assert'); +const topKFrequent = require('../../LeetcodeProblems/Algorithms/Top_K_Frequent_Elements').topKFrequent; + +var test = function () { + assert.deepEqual(topKFrequent([1,1,1,2,2,3], 2).sort(), [1,2]); + assert.deepEqual(topKFrequent([7,8,9,8,9,8], 2).sort(), [8,9]); + assert.deepEqual(topKFrequent([1,1,1,1], 1).sort(), [1]); +} + +module.exports.test = test; diff --git a/README.md b/README.md index 91d495b..6bf105e 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ To run a specific problem in your console run `node ` (e.g. | [Find Subarrays With Equal Sum ](/LeetcodeProblems/Algorithms/Find_Subarrays_With_Equal_Sums.js) | Medium | https://leetcode.com/problems/find-subarrays-with-equal-sum/ | | [Reverse Integer](/LeetcodeProblems/Algorithms/Reverse_Integer.js) | Medium | https://leetcode.com/problems/reverse-integer/ | | [Minimize Maximum Pair Sum in Array ](/LeetcodeProblems/Algorithms/Minimize_Maximum_Pair_Sum_In_Array.js) | Medium | https://leetcode.com/problems/minimize-maximum-pair-sum-in-array/ | +| [Top K Frequent Elements ](/LeetcodeProblems/Algorithms/Top_K_Frequent_Elements.js) | Medium | https://leetcode.com/problems/top-k-frequent-elements/ | | [Flood Fill ](/LeetcodeProblems/Algorithms/Flood_Fill.js) | Easy | https://leetcode.com/problems/flood-fill/ | | [Implement stack using queues ](/LeetcodeProblems/Algorithms/Implement_stack_using_queues.js) | Easy | https://leetcode.com/problems/implement-stack-using-queues/ | | [Number of Segments in a String ](/LeetcodeProblems/Algorithms/Number_of_Segments_in_a_String.js) | Easy | https://leetcode.com/problems/number-of-segments-in-a-string/ |