Greedy策略: 讓總按鍵次數最少 Min Num of Push to Type Word II_LC #3016

更新於 發佈於 閱讀時間約 6 分鐘

題目敘述: Minimum Number of Pushes to Type Word II


給定一個傳統手機鍵盤,如圖所示

raw-image

接著給定一個字串word。

現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應


請問重新安排之後,最少要按幾次鍵盤才能輸出給定的字串word?


測試範例

Example 1:

重新安排後的鍵盤最佳配置

raw-image
Input: word = "abcde"
Output: 5
Explanation: The remapped keypad given in the image provides the minimum cost.
"a" -> one push on key 2
"b" -> one push on key 3
"c" -> one push on key 4
"d" -> one push on key 5
"e" -> one push on key 6
Total cost is 1 + 1 + 1 + 1 + 1 = 5.
It can be shown that no other mapping can provide a lower cost.


Example 2:

重新安排後的鍵盤最佳配置

raw-image
Input: word = "xyzxyzxyzxyz"
Output: 12
Explanation: The remapped keypad given in the image provides the minimum cost.
"x" -> one push on key 2
"y" -> one push on key 3
"z" -> one push on key 4
Total cost is 1 * 4 + 1 * 4 + 1 * 4 = 12
It can be shown that no other mapping can provide a lower cost.
Note that the key 9 is not mapped to any letter: it is not necessary to map letters to every key, but to map all the letters.


Example 3:

重新安排後的鍵盤最佳配置

raw-image
Input: word = "aabbccddeeffgghhiiiiii"
Output: 24
Explanation: The remapped keypad given in the image provides the minimum cost.
"a" -> one push on key 2
"b" -> one push on key 3
"c" -> one push on key 4
"d" -> one push on key 5
"e" -> one push on key 6
"f" -> one push on key 7
"g" -> one push on key 8
"h" -> two pushes on key 9
"i" -> one push on key 9
Total cost is 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 2 * 2 + 6 * 1 = 24.
It can be shown that no other mapping can provide a lower cost.

約束條件

Constraints:

  • 1 <= word.length <= 10^5

輸入字串長度介於1~十萬。

  • word consists of lowercase English letters.

輸入字串只會有小寫英文字母


觀察 如何讓按鍵次數變少?


直覺的想法就是,

最頻繁使用到的字元放到第一排,接著放頻率次高的,依此類推

最後才放頻率最低的到最後一排。



演算法 Greedy策略,根據出現次數進行最佳化


承接觀察點的思考,先建立一個字典,統計每個英文字母的出現次數

接著進行排序,讓前8個出現次數最高的優先排在第一排,接著放8個次高到第二排,...,依此類推。

核心觀念:用最小的成本(按鍵次數)去服務最常用到的英文字母


程式碼 Greedy策略,根據出現次數進行最佳化

class Solution:
def minimumPushes(self, word: str) -> int:

# a list of occurrences of characters
occurrence = list( Counter(word).values() )

# Keep in descending order from high frequency to low frequency
occurrence.sort(reverse = True)

# First 8 high frequency characters put on first level
# Second 8 high frequency characters put on second level
# ... and so on
return sum( occ * (i // 8 + 1) for i, occ in enumerate(occurrence) )

複雜度分析

時間複雜度: O(n)

掃描輸入字串的每個字元,耗時O(n)

這個案例中,排序的成本反而比較小 = O(26 log 26) = O(1) = 常數級別


空間複雜度: O(1)

建立字典所需空間最大為O(26) = O(1) = 小寫英文字母的數量


Reference:

[1] Minimum Number of Pushes to Type Word II - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
給定一個9x9的輸入陣列代表數獨題目已經 部分作答 的狀態, 請驗證已經作答的部分是否為合法的Sudoku的輸入。 註: 合法的Sudoku輸入必須滿足這些規則 1~9每一直排恰好出現一次。 1~9每一橫排恰好出現一次。 1~9在3x3的小方陣裏恰好出現一次。
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
給定一個9x9的輸入陣列代表數獨題目已經 部分作答 的狀態, 請驗證已經作答的部分是否為合法的Sudoku的輸入。 註: 合法的Sudoku輸入必須滿足這些規則 1~9每一直排恰好出現一次。 1~9每一橫排恰好出現一次。 1~9在3x3的小方陣裏恰好出現一次。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
透過適當的語言和文字表達,人們可以溝通訊息和態度。轉折詞的運用和標點符號的使用會影響溝通的準確性和情緒表達。
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
讓我們從程式開始看起,我們輸入的鍵都是KeY,卻在寫入ini時,都轉換成小寫了。 因為預設情況下,configparser 會將配置文件中的鍵(Key)轉換成小寫形式。也就是說,即使配置文件中鍵的寫法是大寫或混合大小寫,讀取時都會轉換成小寫。 如以下的程式範例 其中的鍵值為KeY1 KeY2
Thumbnail
手指在鍵盤上不斷的敲打著,盡是一些沒有條理的字句,待我停下所有的動作,看著自己敲打出來的字句,我為自己做了個總結,我允許我自己今日思緒紛亂。
脆怎麼從0到3899追蹤?怎麼連續串54天不停更? 以下就以五點展開這個話題,每個方向最多三個提醒讓你好記好執行 1.心態怎麼調整 ①如果不能徹底執行就不要開始 ②既然開始了就不要停 ③從你開始挑戰自己,只有達到自己設定的目標才可以終止 2.執行力困難度有多高,如何克服 ①你有
Thumbnail
長時間使用電腦的你,喜歡使用什麼類型的鍵盤? 1. 可以使用就好 2. 每天都要用,買一個自己喜歡的造型,用來工作,心情也會好點 3. 作為玩家,只要有RGB,規格什麼的不重要 4. 除了有RGB,觸發時間和軸體,也是很重要的~
Thumbnail
過了許久終於要從筆電換成了桌機,電腦配件幾乎也都需要再添購,這次看了很久的鍵盤,每一次都跑到3C店給他一直按來按去。最終挑到了這把 irocks K86R!
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
透過適當的語言和文字表達,人們可以溝通訊息和態度。轉折詞的運用和標點符號的使用會影響溝通的準確性和情緒表達。
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
讓我們從程式開始看起,我們輸入的鍵都是KeY,卻在寫入ini時,都轉換成小寫了。 因為預設情況下,configparser 會將配置文件中的鍵(Key)轉換成小寫形式。也就是說,即使配置文件中鍵的寫法是大寫或混合大小寫,讀取時都會轉換成小寫。 如以下的程式範例 其中的鍵值為KeY1 KeY2
Thumbnail
手指在鍵盤上不斷的敲打著,盡是一些沒有條理的字句,待我停下所有的動作,看著自己敲打出來的字句,我為自己做了個總結,我允許我自己今日思緒紛亂。
脆怎麼從0到3899追蹤?怎麼連續串54天不停更? 以下就以五點展開這個話題,每個方向最多三個提醒讓你好記好執行 1.心態怎麼調整 ①如果不能徹底執行就不要開始 ②既然開始了就不要停 ③從你開始挑戰自己,只有達到自己設定的目標才可以終止 2.執行力困難度有多高,如何克服 ①你有
Thumbnail
長時間使用電腦的你,喜歡使用什麼類型的鍵盤? 1. 可以使用就好 2. 每天都要用,買一個自己喜歡的造型,用來工作,心情也會好點 3. 作為玩家,只要有RGB,規格什麼的不重要 4. 除了有RGB,觸發時間和軸體,也是很重要的~
Thumbnail
過了許久終於要從筆電換成了桌機,電腦配件幾乎也都需要再添購,這次看了很久的鍵盤,每一次都跑到3C店給他一直按來按去。最終挑到了這把 irocks K86R!