SQL 分群語法 公車上車的最後一位乘客 Leetcode #1204

閱讀時間約 5 分鐘

題目敘述

題目會給我們一張資料表Queue,代表乘客排隊上車的情境。

裡面分別有person_id、 person_name 、weight、turn等欄位,分別代表乘客ID、乘客姓名、乘客重量、乘客排隊的順序。其中person_id做為主鍵Primary key

要求我們判斷,在不超重(乘客總重量在1000 公斤以內)的條件下,最後一位上車的乘客是誰?

題目額外保證,一定存在一組解答。


詳細的題目可在這裡看到


測試範例

Example 1:

Input: 
Queue table:
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5 | Alice | 250 | 1 |
| 4 | Bob | 175 | 5 |
| 3 | Alex | 350 | 2 |
| 6 | John Cena | 400 | 3 |
| 1 | Winston | 500 | 6 |
| 2 | Marie | 200 | 4 |
+-----------+-------------+--------+------+

Output:
+-------------+
| person_name |
+-------------+
| John Cena |
+-------------+

Explanation: The folowing table is ordered by the turn for simplicity.
+------+----+-----------+--------+--------------+
| Turn | ID | Name | Weight | Total Weight |
+------+----+-----------+--------+--------------+
| 1 | 5 | Alice | 250 | 250 |
| 2 | 3 | Alex | 350 | 600 |
| 3 | 6 | John Cena | 400 | 1000 | (last person to board)
| 4 | 2 | Marie | 200 | 1200 | (cannot board)
| 5 | 4 | Bob | 175 | ___ |
| 6 | 1 | Winston | 500 | ___ |
+------+----+-----------+--------+--------------+

演算法

主要有兩個考察點。

  1. 聯想到用Prefix sum前綴和: 用乘客體重的前綴和,方便之後去判斷最後一位可以安全上車的乘客是誰
  2. 使用分群 和 排序語法,輸出最後一位可以安全上車的乘客ID。


  1. 計算乘客體重的前綴和
# Write your MySQL query statement below
SELECT q1.person_name
FROM Queue AS q1
INNER JOIN Queue AS q2
# Prefix sum of weight to each passenger
ON q1.turn >= q2.turn


  1. 結合 分群GROUP BY 排序 ORDER BY語法,輸出最後一位可以安全上車的乘客ID。
GROUP BY q1.turn

# Weight limit 1000 Kg
HAVING SUM(q2.weight) <= 1000

# Sort total weight on descending order
ORDER BY SUM(q2.weight) DESC
# Last one
LIMIT 1;

程式碼

換行的空白只是方便讀者閱讀理解,實際上可以拿掉。

SELECT q1.person_name
FROM Queue AS q1
INNER JOIN Queue AS q2
# Prefix sum of weight to each passenger
ON q1.turn >= q2.turn
GROUP BY q1.turn

# Weight limit 1000 Kg
HAVING SUM(q2.weight) <= 1000

# Sort total weight on descending order
ORDER BY SUM(q2.weight) DESC
# Last one
LIMIT 1;

關鍵知識點

  1. 聯想到用Prefix sum前綴和: 用乘客體重的前綴和,方便之後去判斷最後一位可以安全上車的乘客是誰。這點比較困難,可以在學會之後,多在紙筆或SQL平台上練習幾次,增加熟練度。


  1. 使用分群 和 排序語法,輸出最後一位可以安全上車的乘客ID。

Reference:

[1] MySQL by prefix sum of weight [w/ Comment] - Last Person to Fit in the Bus - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一張資料表Triangle。 裡面分別有x、 y、z等欄位,分別代表三個邊長。其中(x、 y、z)做為複合主鍵Primary key 要求我們判斷,每條data row裡面的x, y, z 能否構成一個合法的三角形? 如果可以,返回字串"Yes";如果不行,返回字串"No
題目敘述 題目會給我們一張Employee 資料表。裡面分別有employee_id、department_id 、primary_flag 等欄位。其中(employee_id, department_id) 是這張資料表的複合主鍵Primary key。 要求我們列出每一位員工的主要歸屬
題目敘述 題目會給我們一張Employees 資料表。裡面分別有employee_id、name、reports_to 、age 等欄位。其中employee_id 是這張資料表的主鍵Primary key。 要求我們列出每一位經理人下轄部屬的數量和部屬的平均年齡(四捨五入到最接近的整數)。
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
題目敘述 題目會給我們一張資料表Triangle。 裡面分別有x、 y、z等欄位,分別代表三個邊長。其中(x、 y、z)做為複合主鍵Primary key 要求我們判斷,每條data row裡面的x, y, z 能否構成一個合法的三角形? 如果可以,返回字串"Yes";如果不行,返回字串"No
題目敘述 題目會給我們一張Employee 資料表。裡面分別有employee_id、department_id 、primary_flag 等欄位。其中(employee_id, department_id) 是這張資料表的複合主鍵Primary key。 要求我們列出每一位員工的主要歸屬
題目敘述 題目會給我們一張Employees 資料表。裡面分別有employee_id、name、reports_to 、age 等欄位。其中employee_id 是這張資料表的主鍵Primary key。 要求我們列出每一位經理人下轄部屬的數量和部屬的平均年齡(四捨五入到最接近的整數)。
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
題目敘述 題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。 要求我們,以課程做分群,列出至少有五位同學的課程。 輸出的順序不拘。 Table: Courses
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
星期六清晨,匆匆踏上開往上水的巴士。之所以趕早,為的是避開北上洶湧澎湃的人潮。 八點半的上水火車站大廳行人來去匆匆。緊隨一中年男的身後,誰料快到閘口時,該仁兄突然煞停,好在我反應靈敏,沒有「追尾」。搞甚麼鬼啊?來到閘口才注意,原來前方不遠處有一個貌似車站職員的女人,正虎視眈眈地盯著每一道閘口,只要
Thumbnail
上下班總是會走到前一個站牌等車,走路運動一下,原站松山車站公車站人太多了,不容易搶到位置,我喜歡先人一步的感覺。 其實走到前兩站也是經常的事,看APP到公車到站時間如果還可以,提前兩站上車沒有坐到位置的機率幾乎為零。 搶到位置坐主要有兩個原因,台北公車急煞急駛真的很不友善,身體一下子被拉長變扭曲
會搭計程車的乘客形形色色,三教九流各式各樣各種類別的人都有。 但這篇文章要寫的是計程車司機最喜歡的乘客類別 。
誰是獵人?誰是獵物?誰是釣客誰是魚?誰在佈局?
10/26/2015 航段   在台北飛往東京UA838的航班上,我被排在中間的座位。 左邊一個胖老外,右邊一個瘦老外。   我告訴自己,這算是是平衡嗎?   櫃台小姐告訴我,己經沒有走道的位置了。 坐走道是因為可以隨時起身,去看看團員們。 坐在中間,也不無好處,心想,那也好,我
Thumbnail
一位年輕人不小心乘坐上了一班已經停駛多年的2011號公車並行駛至終點站,此時的他又該如何下山呢……
Thumbnail
※ 資料庫與 SQL ※ 題目: 請寫出 SQL 讀取 people table 中所有 gender 是 M 而且 age 大於 18 的資料。 ※ 解答: SELECT * FROM people WHERE gender = 'M' AND a
Thumbnail
終於,擺渡車到站,我抓著老婦人,立即衝下車後,就拚命地往航班登機口的方向跑去。 期間,即使借助那些平面的自動電梯,但也還是得在上頭跑著,就只怕趕不上登機時間。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
星期六清晨,匆匆踏上開往上水的巴士。之所以趕早,為的是避開北上洶湧澎湃的人潮。 八點半的上水火車站大廳行人來去匆匆。緊隨一中年男的身後,誰料快到閘口時,該仁兄突然煞停,好在我反應靈敏,沒有「追尾」。搞甚麼鬼啊?來到閘口才注意,原來前方不遠處有一個貌似車站職員的女人,正虎視眈眈地盯著每一道閘口,只要
Thumbnail
上下班總是會走到前一個站牌等車,走路運動一下,原站松山車站公車站人太多了,不容易搶到位置,我喜歡先人一步的感覺。 其實走到前兩站也是經常的事,看APP到公車到站時間如果還可以,提前兩站上車沒有坐到位置的機率幾乎為零。 搶到位置坐主要有兩個原因,台北公車急煞急駛真的很不友善,身體一下子被拉長變扭曲
會搭計程車的乘客形形色色,三教九流各式各樣各種類別的人都有。 但這篇文章要寫的是計程車司機最喜歡的乘客類別 。
誰是獵人?誰是獵物?誰是釣客誰是魚?誰在佈局?
10/26/2015 航段   在台北飛往東京UA838的航班上,我被排在中間的座位。 左邊一個胖老外,右邊一個瘦老外。   我告訴自己,這算是是平衡嗎?   櫃台小姐告訴我,己經沒有走道的位置了。 坐走道是因為可以隨時起身,去看看團員們。 坐在中間,也不無好處,心想,那也好,我
Thumbnail
一位年輕人不小心乘坐上了一班已經停駛多年的2011號公車並行駛至終點站,此時的他又該如何下山呢……
Thumbnail
※ 資料庫與 SQL ※ 題目: 請寫出 SQL 讀取 people table 中所有 gender 是 M 而且 age 大於 18 的資料。 ※ 解答: SELECT * FROM people WHERE gender = 'M' AND a
Thumbnail
終於,擺渡車到站,我抓著老婦人,立即衝下車後,就拚命地往航班登機口的方向跑去。 期間,即使借助那些平面的自動電梯,但也還是得在上頭跑著,就只怕趕不上登機時間。