快樂崇拜 小朋友的快樂值 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
留言分享你的想法!
媗日-avatar-img
2024/05/09
快樂崇拜不是一首歌嗎🤣🤣🤣
小松鼠-avatar-img
發文者
2024/05/09
媗日 厲害喔,快樂到底屬於哪個年代 七零 八零 九零 還是Y世代?🤣
avatar-img
小松鼠的演算法樂園
95會員
426內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
Thumbnail
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
輸入給定一個已經從小到大排序好,而且彼此互質的整數陣列, 請問任取兩數分別當作分子、分母,第k小的分數是多少? 輸出請以 [分子,分母] 的形式回傳答案。
Thumbnail
輸入給定一個已經從小到大排序好,而且彼此互質的整數陣列, 請問任取兩數分別當作分子、分母,第k小的分數是多少? 輸出請以 [分子,分母] 的形式回傳答案。
Thumbnail
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
Thumbnail
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
題目敘述 題目會給定一個二元陣列nums(也就是說,陣列元素只有0,1這兩種情況)和指定的k值。 我們最多可以把k個0反轉成1,請問連續唯一的最長子陣列的長度是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,1,1,0,0,0,1,1,1,1,
Thumbnail
題目敘述 題目會給定一個二元陣列nums(也就是說,陣列元素只有0,1這兩種情況)和指定的k值。 我們最多可以把k個0反轉成1,請問連續唯一的最長子陣列的長度是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,1,1,0,0,0,1,1,1,1,
Thumbnail
題目敘述 題目會給定一個有n個整數的陣列nums和指定的k值,問我們長度為k的子陣列的平均值的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 Explanati
Thumbnail
題目敘述 題目會給定一個有n個整數的陣列nums和指定的k值,問我們長度為k的子陣列的平均值的最大值是多少? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 Explanati
Thumbnail
題目敘述 題目會給定一個陣列candies和一個整數extraCandies作為輸入。 陣列candies代表每一位小朋友手上擁有的糖果總數。 問我們,從頭到尾每一位小朋友,如果多給extraCandies顆糖果給其中某一位小朋友,那位小朋友拿到的糖果數量是不是最多的?假如是,則標記為True
Thumbnail
題目敘述 題目會給定一個陣列candies和一個整數extraCandies作為輸入。 陣列candies代表每一位小朋友手上擁有的糖果總數。 問我們,從頭到尾每一位小朋友,如果多給extraCandies顆糖果給其中某一位小朋友,那位小朋友拿到的糖果數量是不是最多的?假如是,則標記為True
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目敘述 題目會給我們一個輸入整數陣列arr,和一個初始化的刪除次數k? 我們可以任意選擇從arr中刪除k個陣列元素,請問最後留下來的數字,最少會有幾個不同的數字? 註: 最後不同的數字越少越好。 題目的原文敘述 測試範例 Example 1: Input: arr = [5,5
Thumbnail
題目敘述 題目會給我們一個輸入整數陣列arr,和一個初始化的刪除次數k? 我們可以任意選擇從arr中刪除k個陣列元素,請問最後留下來的數字,最少會有幾個不同的數字? 註: 最後不同的數字越少越好。 題目的原文敘述 測試範例 Example 1: Input: arr = [5,5
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News