好的子陣列的最大分數 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
91會員
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
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
給定一個長度為 n 的整數數組 nums 和一個整數target,在 nums 中找到三個整數,使得總和最接近target。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。
給定兩個已排序的陣列 nums1 和 nums2,請找到並返回這兩個陣列的中位數。要求時間複雜度為 O(log(min(m, n))),其中 m 和 n 分別是兩個陣列的長度。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
高低分組,顧名思義,就是把考生的成績分成兩組:表現最好的一組和表現最差的一組。依據Kelley(1939),通常前27%的考生是高分組,後27%的考生是低分組。如果高分組和低分組的表現差異很大,那麼說明這題題目鑑別度高,能有效區分不同程度的考生。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
Thumbnail
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
給定一個長度為 n 的整數數組 nums 和一個整數target,在 nums 中找到三個整數,使得總和最接近target。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。
給定兩個已排序的陣列 nums1 和 nums2,請找到並返回這兩個陣列的中位數。要求時間複雜度為 O(log(min(m, n))),其中 m 和 n 分別是兩個陣列的長度。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
高低分組,顧名思義,就是把考生的成績分成兩組:表現最好的一組和表現最差的一組。依據Kelley(1939),通常前27%的考生是高分組,後27%的考生是低分組。如果高分組和低分組的表現差異很大,那麼說明這題題目鑑別度高,能有效區分不同程度的考生。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
Thumbnail
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。