好的子陣列的最大分數 Maximum Score of a Good Subarray_Leetcode#1793

閱讀時間約 4 分鐘
raw-image

這題的題目在這裡:


題目敘述

題目會給們一個陣列nums,還有一個k值。

好陣列定義是: 有包含nums[k]的子陣列。

分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1)

其中, i, j 分別是子陣列的左端點和右端點

請問,好的子陣列的最大分數是多少?


測試範例

Example 1:

Input: nums = [1,4,3,7,4,5], k = 3
Output: 15
Explanation: The optimal subarray is (1, 5) with a score of min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15.

Example 2:

Input: nums = [5,5,4,5,4,1,1,1], k = 0
Output: 20
Explanation: The optimal subarray is (0, 4) with a score of min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20.

約束條件

Constraints:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 2 * 104
  • 0 <= k < nums.length

演算法

因為題目一開始要求好的子陣列一定要包含nums[k]

所以讓滑窗初始化在nums[k]


接著,分數的定義是 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1)

= 滑窗內的最小值 * 滑窗長度


為了最大化分數讓滑窗往左右兩個,其中比較大的那一側去延伸,盡量讓分數維持住,下滑的慢一點。每一回合迭代去更新滑窗位的位置 和 分數的最大值。

最後,全部的滑窗延伸走完之後,分數的最大值就是 好的子陣列的最大分數,也是題目所求的最終答案。


程式碼

class Solution:
 def maximumScore(self, nums: List[int], k: int) -> int:

  # Initialize sliding window at nums[k]
  left, right = k, k
  min_val = nums[k]

  # Max score of good array
  max_score = min_val
  
  while left > 0 or right < len(nums) - 1:

   if left == 0 or (right < len(nums) - 1 and nums[right + 1] > nums[left - 1]):
    # right hand side is larger
    right += 1
   else:
    # left hand side is larger
    left -= 1

   # update minimal value of sliding window
   min_val = min(min_val, nums[left], nums[right])

   # update and maximize score of good array
   max_score = max(max_score, min_val * (right - left + 1))
  
  return max_score

複雜度分析

時間複雜度: O( n)
一次線性掃描,滑窗從長度為1 拓展到長度為n。

空間複雜度: O(1)
使用到的變數都是固定尺寸的臨時變數,皆為常數級別O(1)。


關鍵知識點

為了最大化分數讓滑窗往左右兩個,其中比較大的那一側去延伸,盡量讓分數維持住,下滑的慢一點。每一回合迭代去更新滑窗位的位置 和 分數的最大值。


Reference:

[1] Python O(n) by sliding window and greedy [w/ Comment] - Maximum Score of a Good Subarray - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
海苔醬自從有小孩後就會特別關注育兒相關資訊,其中一定要推薦的就是免費好玩的親子館!回想第一次知道這個資源時,想說搜尋距離住家最方便的親子館,直接去現場瞭解看看究竟是一個怎樣的環境。因為事前沒有多做功課,結果詢問櫃檯服務人員後才知道入館一定要帶小孩的健保卡跟大人的身分證或健保卡,只要少帶一樣都無法入館
子宮肌腺症是一種子宮病變,會造成婦女嚴重經痛和血崩,此疾病來自於子宮內膜細胞沒有乖乖待在子宮內膜腔,侵襲到子宮肌肉層中,塞成塊狀,造成子宮腫大。較常見型態是整個子宮瀰漫性擴大,稱為子宮肌腺症。 發病症狀 子宮肌腺症最大的問題就是她有可能「無症狀」,導致病人自己都不知情,而有三大典型的症狀可以提供
Thumbnail
茶香、茶鄉,南投名間鄉的松柏嶺盛產茶業也是茶園最密集的地區,處處可見療癒茶園,因此也有個茶鄉的美名,南投景點除了以茶為名的茶香步道、各家茶莊、香火鼎盛的受天宮等,本文為大家分享炎炎夏日的好去處,南投親子景點「茶二指故事館」園區分享,百元門票還可折抵消費!
Thumbnail
有女網友在網路討論區問大家:「對愛情已沒有期待,打算單身一輩子,不知道要做好什麼準備?」此問題熱烈引起網友的討論。網友表示「個性要很獨立,凡事都要自己來。」「同婚合法後,和閨密同住,互相享有配偶在法律上的權利。」「怕孤獨一人死在家中,已和單身好友約好住附近互相關照。」
Thumbnail
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
Thumbnail
「令人怦然心動的口感」,是第一口吃下PapaOligo半乳寡糖益生元的感受。 跟想像中完全不一樣,好吃的程度可能是保健食品的天花板。 在Youtube看到謝盈萱的廣告,不得不說她本人舉手頭足充滿說服力,瑜珈姿勢跟我平常做的招式差不多,但輕盈程度我真的是,差遠了。 不管是心理或生理,都是想追
Thumbnail
原來婚姻不是從此永遠幸福的在一起,是柴米油鹽還有你們我們他們。 B先生,24歲,憂鬱症。第一次被強制就醫,原因是計畫透過服藥過量來結束生命。沒有病史。目前已婚四年,正在辦離婚手續,有份穩定的工作。 B看起來比他的真實年齡成熟一些,言談舉止斯文而有禮貌 ; 以一個第一次進入精神病院的人來說,可以說是相
Thumbnail
在捷運大安站旁巷子內的’這間咖啡’,主推咖啡、鹹食、甜點,在我看來,有點像是國外的餐酒館。人人都需要一個情緒避難所,在我看來,'這間咖啡'無疑是最佳選擇之一。
Thumbnail
- 欸 你愛一個人的樣子好可悲 將一首詩剪得支離破碎灑在他桌上 期望他像拼圖那樣將它黏好 像電影裡那樣讀出你的文字 結果他只是困擾的笑了 將碎片掃進手心 從你身旁經過,將它們倒進垃圾桶 然後 你所謂痛恨世界的樣子好可悲 背台詞般唸著抄來的抱怨 以為那樣就是憤世嫉俗 把你空洞的言語傾倒在人們身上 以為
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
海苔醬自從有小孩後就會特別關注育兒相關資訊,其中一定要推薦的就是免費好玩的親子館!回想第一次知道這個資源時,想說搜尋距離住家最方便的親子館,直接去現場瞭解看看究竟是一個怎樣的環境。因為事前沒有多做功課,結果詢問櫃檯服務人員後才知道入館一定要帶小孩的健保卡跟大人的身分證或健保卡,只要少帶一樣都無法入館
子宮肌腺症是一種子宮病變,會造成婦女嚴重經痛和血崩,此疾病來自於子宮內膜細胞沒有乖乖待在子宮內膜腔,侵襲到子宮肌肉層中,塞成塊狀,造成子宮腫大。較常見型態是整個子宮瀰漫性擴大,稱為子宮肌腺症。 發病症狀 子宮肌腺症最大的問題就是她有可能「無症狀」,導致病人自己都不知情,而有三大典型的症狀可以提供
Thumbnail
茶香、茶鄉,南投名間鄉的松柏嶺盛產茶業也是茶園最密集的地區,處處可見療癒茶園,因此也有個茶鄉的美名,南投景點除了以茶為名的茶香步道、各家茶莊、香火鼎盛的受天宮等,本文為大家分享炎炎夏日的好去處,南投親子景點「茶二指故事館」園區分享,百元門票還可折抵消費!
Thumbnail
有女網友在網路討論區問大家:「對愛情已沒有期待,打算單身一輩子,不知道要做好什麼準備?」此問題熱烈引起網友的討論。網友表示「個性要很獨立,凡事都要自己來。」「同婚合法後,和閨密同住,互相享有配偶在法律上的權利。」「怕孤獨一人死在家中,已和單身好友約好住附近互相關照。」
Thumbnail
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
Thumbnail
「令人怦然心動的口感」,是第一口吃下PapaOligo半乳寡糖益生元的感受。 跟想像中完全不一樣,好吃的程度可能是保健食品的天花板。 在Youtube看到謝盈萱的廣告,不得不說她本人舉手頭足充滿說服力,瑜珈姿勢跟我平常做的招式差不多,但輕盈程度我真的是,差遠了。 不管是心理或生理,都是想追
Thumbnail
原來婚姻不是從此永遠幸福的在一起,是柴米油鹽還有你們我們他們。 B先生,24歲,憂鬱症。第一次被強制就醫,原因是計畫透過服藥過量來結束生命。沒有病史。目前已婚四年,正在辦離婚手續,有份穩定的工作。 B看起來比他的真實年齡成熟一些,言談舉止斯文而有禮貌 ; 以一個第一次進入精神病院的人來說,可以說是相
Thumbnail
在捷運大安站旁巷子內的’這間咖啡’,主推咖啡、鹹食、甜點,在我看來,有點像是國外的餐酒館。人人都需要一個情緒避難所,在我看來,'這間咖啡'無疑是最佳選擇之一。
Thumbnail
- 欸 你愛一個人的樣子好可悲 將一首詩剪得支離破碎灑在他桌上 期望他像拼圖那樣將它黏好 像電影裡那樣讀出你的文字 結果他只是困擾的笑了 將碎片掃進手心 從你身旁經過,將它們倒進垃圾桶 然後 你所謂痛恨世界的樣子好可悲 背台詞般唸著抄來的抱怨 以為那樣就是憤世嫉俗 把你空洞的言語傾倒在人們身上 以為