滑動窗口應用: 成功組隊的數目 Count Number of Teams_Leetcode #1395

閱讀時間約 4 分鐘

題目敘述 Count Number of Teams

給定一個輸入陣列rating,裡面代表每位成員的評分

挑選三位成員,對應到三個index i, j, k 且 i < j < k

如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。

或者rating[i] > rating[j] > rating[k] ,則此三人也可以組成一隊。

請問成功組成三人小隊的方法數有多少?


測試範例

Example 1:

Input: rating = [2,5,3,4,1]
Output: 3
Explanation:
成功的組隊方式 (2,3,4), (5,4,1), (5,3,1).

Example 2:

Input: rating = [2,1,3]
Output: 0
Explanation:
無解 無法找到 評分遞減或評分遞增的三人組隊方式​

Example 3:

Input: rating = [1,2,3,4]
Output: 4
成功的組隊方式 (1,2,3), (1,2,4), (1,3,4), (2,3,4).

演算法 滑動窗口 + 統計左側右側資訊


假想中央那名成員為在index j 的位置,
統計左方rating 比較小 和 右方rating比較大的成員數量。

如次一來,
遞增排列組隊方法數 = 左方rating比較小的成員數量 * 右方rating比較大的成員數量

遞減排列組隊方法數 = 左方rating比較大的成員數量 * 右方rating比較小的成員數量


最後,用一個for loop,把index j 從頭到尾掃描一遍,累加所有合法的組隊方式即可。


示意圖 滑動窗口 + 統計左側右側資訊

raw-image

程式碼 滑動窗口 + 統計左側右側資訊

class Solution:
def numTeams(self, rating: List[int]) -> int:
r, size = rating, len( rating )

# compute statistics of sliding range
left_smaller = [ sum( r[i] < r[j] for i in range(0,j) ) for j in range(size) ]
right_bigger = [ sum( r[j] < r[k] for k in range(j+1, size) ) for j in range(size)]

num_of_teams = 0

# j slides from 0 to ( n-1 ), and j stands for the index of middle element
for j in range( 0, size):

num_of_ascending_team = left_smaller[j] * right_bigger[j]
num_of_descending_team = ( j - left_smaller[j] ) * ( size-1 - j - right_bigger[j] )

num_of_teams += ( num_of_ascending_team + num_of_descending_team )

return num_of_teams


複雜度分析

時間複雜度: O(n^2)

預先統計左右兩次資訊,雙層迴圈耗費O(n^2)

累加組隊數量,單層迴圈耗費O(n)


空間複雜度: O(n)

預先統計左右兩次資訊,需要額外的O(n)空間


Reference

[1] Count Number of Teams - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Sort the Jumbled Numbers 給定兩個輸入陣列 第一個是映射表,提供0~9 mapping到新數字的映射關係。 第二個陣列是原始數值。 請重新排序原始數值,排序依據是根據映射表對應之後的新數值的大小決定。 如果對應之後的新數值大小相同,則由原本的前後相對順序決定。
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
給定兩個輸入陣列,第一個陣列代表每個人的姓名,第二個陣列代表每個人的身高。依照身高從高到矮進行排列,輸出每個人的名字。本文介紹了一個根據身高排列人名的算法,並提供了相關的程式碼和時間複雜度分析。
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
給定一個陣列,分別代表每位顧客的抵達時間和廚師準備時間。請問平均的等待時間是多少? 等待時間定義為客人開始真正用餐的時間 - 客人抵達的時間。演算法為計算廚師的出餐時間。
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Sort the Jumbled Numbers 給定兩個輸入陣列 第一個是映射表,提供0~9 mapping到新數字的映射關係。 第二個陣列是原始數值。 請重新排序原始數值,排序依據是根據映射表對應之後的新數值的大小決定。 如果對應之後的新數值大小相同,則由原本的前後相對順序決定。
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
給定兩個輸入陣列,第一個陣列代表每個人的姓名,第二個陣列代表每個人的身高。依照身高從高到矮進行排列,輸出每個人的名字。本文介紹了一個根據身高排列人名的算法,並提供了相關的程式碼和時間複雜度分析。
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
給定一個陣列,分別代表每位顧客的抵達時間和廚師準備時間。請問平均的等待時間是多少? 等待時間定義為客人開始真正用餐的時間 - 客人抵達的時間。演算法為計算廚師的出餐時間。
你可能也想看
Google News 追蹤
Thumbnail
平時下棋是一對一進行,完全是倚賴個人的實力一較高下,而圍棋也是可以分隊比賽,在外課上課時,為了增進大家的向心力,舉辦了「隊際賽」,分成兩隊輪流上台落子,也在交換棒次的間隔可以讓大家討論,讓棋力強的同學帶領大家,也讓大家感受不一樣的下棋方式!
Thumbnail
球隊陣型是影響比賽角球數量的重要因素。不同的陣型有不同的戰術目標和風格,這些都會影響角球投注的分析。
Thumbnail
嗨JC! 這星期如何?連隊裡受訓的兵,走了一些人,來了一些人,馬上就迎來期中測驗。 唉啊,見真章的時候到了。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
我相信有更聰明好用的方法,不過目前我還是喜歡用這個一人群組。
Thumbnail
本文將帶你探索單淘汰、雙敗淘汰以及循環賽的場次計算,讓你成為賽事計算大師!計算比賽場次的數量,讓你不再傻眼!
Thumbnail
平時下棋是一對一進行,完全是倚賴個人的實力一較高下,而圍棋也是可以分隊比賽,在外課上課時,為了增進大家的向心力,舉辦了「隊際賽」,分成兩隊輪流上台落子,也在交換棒次的間隔可以讓大家討論,讓棋力強的同學帶領大家,也讓大家感受不一樣的下棋方式!
Thumbnail
球隊陣型是影響比賽角球數量的重要因素。不同的陣型有不同的戰術目標和風格,這些都會影響角球投注的分析。
Thumbnail
嗨JC! 這星期如何?連隊裡受訓的兵,走了一些人,來了一些人,馬上就迎來期中測驗。 唉啊,見真章的時候到了。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
高中數學主題練習—求等比數列某項與等差級數
Thumbnail
高中數學主題練習—求等差數列某項與等差級數
Thumbnail
我相信有更聰明好用的方法,不過目前我還是喜歡用這個一人群組。
Thumbnail
本文將帶你探索單淘汰、雙敗淘汰以及循環賽的場次計算,讓你成為賽事計算大師!計算比賽場次的數量,讓你不再傻眼!