快樂崇拜 小朋友的快樂值 Leetcode #3075

閱讀時間約 6 分鐘

題目敘述

輸入給定一個整數陣列,分別代表每小朋友的快樂值

要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值


有一個特殊的規則,第一位選中的小朋友快樂值不變。

接著,第二位選中的小朋友快樂值-1

再接著,第三位選中的小朋友快樂值-2

快樂值扣到只剩下0就不再往下扣

...其餘依此類推


輸出時整數返回答案


原本的英文題目敘述


測試範例

Example 1:

Input: happiness = [1,2,3], k = 2
Output: 4
Explanation: We can pick 2 children in the following way:
- Pick the child with the happiness value == 3. The happiness value of the remaining children becomes [0,1].
- Pick the child with the happiness value == 1. The happiness value of the remaining child becomes [0]. Note that the happiness value cannot become less than 0.
The sum of the happiness values of the selected children is 3 + 1 = 4.

Example 2:

Input: happiness = [1,1,1,1], k = 2
Output: 1
Explanation: We can pick 2 children in the following way:
- Pick any child with the happiness value == 1. The happiness value of the remaining children becomes [0,0,0].
- Pick the child with the happiness value == 0. The happiness value of the remaining child becomes [0,0].
The sum of the happiness values of the selected children is 1 + 0 = 1.

Example 3:

Input: happiness = [2,3,4,5], k = 1
Output: 5
Explanation: We can pick 1 child in the following way:
- Pick the child with the happiness value == 5. The happiness value of the remaining children becomes [1,2,3].
The sum of the happiness values of the selected children is 5.

約束條件

Constraints:

  • 1 <= n == happiness.length <= 2 * 10^5

小朋友的總數介於1~二十萬 之間。

  • 1 <= happiness[i] <= 10^8

每味小朋友的快樂值介於1~一億 之間。

  • 1 <= k <= n

k值介於 1 ~ n 之間。


演算法 排序 或 最大堆MaxHeap

題目很明顯是要挑前k個最大的元素

這個需求可以透過排序或者建造最大堆MaxHeap來滿足

兩種解法都可以,最後複雜度也是同樣O( n log n )等級的。


有一個實作上的細節請留意,題目有額外特殊的規則,每挑一人,快樂值會遞減,一直扣到剩下零為止


程式碼 排序 或 最大堆MaxHeap

class Solution:
def maximumHappinessSum(self, happiness: List[int], k: int) -> int:

happiness.sort( reverse = True )

summation = 0

for i in range(k):

summation += max(happiness[i] - i, 0)

return summation

程式碼 最大堆MaxHeap

class Solution:
def maximumHappinessSum(self, happiness: List[int], k: int) -> int:

heapq._heapify_max(happiness)

summation = 0

for i in range(k):
cur_largest = heapq._heappop_max(happiness)
summation += max(cur_largest - i, 0)

return summation

複雜度分析

時間複雜度: O(n log n)

n個數值進行排序,所需時間為O( n log n)。


空間複雜度: O(1)

in-place排序,in-place建造最大堆,其他用到的都是固定尺寸的O(1)臨時變數。


關鍵知識點

挑前k個最大的元素

這個需求可以透過排序或者建造最大堆MaxHeap來滿足


Reference

[1] Maximize Happiness of Selected Children - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
題目敘述 給定一個piles陣列,裡面對應到每堆石頭的數量。 Alice 和 Bob玩輪流取石頭的遊戲,總共有n堆石頭,每堆的石頭數量有多有少。 Alice先取,接著Bob,反覆交替,每回合輪到的人可以從當下的第一堆或者最後一堆,拿走那堆對應的石頭。 最後比誰拿到的石頭總數量比較多就獲勝。
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
題目敘述 給定一個piles陣列,裡面對應到每堆石頭的數量。 Alice 和 Bob玩輪流取石頭的遊戲,總共有n堆石頭,每堆的石頭數量有多有少。 Alice先取,接著Bob,反覆交替,每回合輪到的人可以從當下的第一堆或者最後一堆,拿走那堆對應的石頭。 最後比誰拿到的石頭總數量比較多就獲勝。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
父母默默的和孩子在同一空間忙自己的事,孩子是無法感受到這份寧靜的愛。期待照顧者能與孩子互動,一起創造美好的童年時光。孩子每個時期的遊戲方式、自我探索,都是有趣且有意義的。
Thumbnail
嗨JC! 第一名真的是很開心,對吧? 不過好像還不能鬆懈下來,畢竟也只是一次第一,還有一堆測驗項目要比,名模生死鬥可不是只有閱兵分列,我沒講錯吧?
Thumbnail
每個人對快樂喜悅的定義...其實不盡相同... 在每個當下~總是可以 "選擇快樂"~ 就看您願意不願意,那麼選。
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
小朋友都玩得很開心,我就會覺得好羨慕
Thumbnail
總複習時間,可以使用畫一畫時的作品來考考孩子,難度比較低,孩子會比較有自信
Thumbnail
這天,孩子們午休起床後,開啟了下午的流程和活動, 在孩子們喝完水後,老師依序讓孩子來拿取點心的餅乾。 這時,老師給了孩子一個指令,請每位孩子數五個餅乾放到自己的杯子裡面再到位置上享用。 過程中,孩子們練習從1數到5, 有些孩子可以很快的數好五個放到杯子裡面,有些孩子會不小心數超
Thumbnail
對兒子上小學的爸爸非常嚴格,要求小孩每天閱讀、寫數學考卷和日記。這篇文章介紹了爸爸如何設計快樂卡來鼓勵孩子自律,讓孩子樂此不疲地完成任務。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
父母默默的和孩子在同一空間忙自己的事,孩子是無法感受到這份寧靜的愛。期待照顧者能與孩子互動,一起創造美好的童年時光。孩子每個時期的遊戲方式、自我探索,都是有趣且有意義的。
Thumbnail
嗨JC! 第一名真的是很開心,對吧? 不過好像還不能鬆懈下來,畢竟也只是一次第一,還有一堆測驗項目要比,名模生死鬥可不是只有閱兵分列,我沒講錯吧?
Thumbnail
每個人對快樂喜悅的定義...其實不盡相同... 在每個當下~總是可以 "選擇快樂"~ 就看您願意不願意,那麼選。
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
小朋友都玩得很開心,我就會覺得好羨慕
Thumbnail
總複習時間,可以使用畫一畫時的作品來考考孩子,難度比較低,孩子會比較有自信
Thumbnail
這天,孩子們午休起床後,開啟了下午的流程和活動, 在孩子們喝完水後,老師依序讓孩子來拿取點心的餅乾。 這時,老師給了孩子一個指令,請每位孩子數五個餅乾放到自己的杯子裡面再到位置上享用。 過程中,孩子們練習從1數到5, 有些孩子可以很快的數好五個放到杯子裡面,有些孩子會不小心數超
Thumbnail
對兒子上小學的爸爸非常嚴格,要求小孩每天閱讀、寫數學考卷和日記。這篇文章介紹了爸爸如何設計快樂卡來鼓勵孩子自律,讓孩子樂此不疲地完成任務。