Given an array of strings `words` and an integer `k`, return _the_ `k` _most frequent strings_.

Return the answer **sorted** by **the frequency** from highest to lowest. Sort the words with the same frequency by their **lexicographical order**.

**Example 1:**

**Input:** words = \[ "i ", "love ", "leetcode ", "i ", "love ", "coding "\], k = 2
**Output:** \[ "i ", "love "\]
**Explanation:**  "i " and  "love " are the two most frequent words.
Note that  "i " comes before  "love " due to a lower alphabetical order.

**Example 2:**

**Input:** words = \[ "the ", "day ", "is ", "sunny ", "the ", "the ", "the ", "sunny ", "is ", "is "\], k = 4
**Output:** \[ "the ", "is ", "sunny ", "day "\]
**Explanation:**  "the ",  "is ",  "sunny " and  "day " are the four most frequent words, with the number of occurrence being 4, 3, 2 and 1 respectively.

**Constraints:**

*   `1 <= words.length <= 500`
*   `1 <= words[i].length <= 10`
*   `words[i]` consists of lowercase English letters.
*   `k` is in the range `[1, The number of **unique** words[i]]`



import heapq
from collections import Counter


def k_frequent_words(words, k):
    word_count = Counter(words)
    heap = [(-count, word) for word, count in word_count.items()]
    heapq.heapify(heap)

    result = []
    for _ in range(k):
        result.append(heapq.heappop(heap)[1])

    return result
