頭角崢嶸 恰好k個元素大於等於k_Leetcode #1608 排序/二分搜尋 應用

閱讀時間約 7 分鐘

題目敘述

給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素 大於等於 k。

無果無解,回傳-1。


原文題目敘述


測試範例

Example 1:

Input: nums = [3,5]
Output: 2
Explanation: There are 2 values (3 and 5) that are greater than or equal to 2.

Example 2:

Input: nums = [0,0]
Output: -1
Explanation: No numbers fit the criteria for x.
If x = 0, there should be 0 numbers >= x, but there are 2.
If x = 1, there should be 1 number >= x, but there are 0.
If x = 2, there should be 2 numbers >= x, but there are 0.
x cannot be greater since there are only 2 numbers in nums.

Example 3:

Input: nums = [0,4,3,0,4]
Output: 3
Explanation: There are 3 values that are greater than or equal to 3.
輸入陣列裡,恰好有3個元素大於等於3

約束條件

Constraints:

  • 1 <= nums.length <= 100

輸入陣列長度介於1~100之間。

  • 0 <= nums[i] <= 1000

每個陣列元素值都介於0~1000之間。


觀察

恰好k個元素 >= k,找出k值。

k值最小可能是1,最大可能是n = len(nums),因為陣列裡最多也才n個元素。

演算法

怎麼找k值?

如果陣列由小到大排序好,那麼可以從左到右掃描每個元素,k值從n到1逐次遞減去檢查,假如有某一次疊代剛好發現有k個元素 >= k,那麼當下的k值就是答案;如果最後都不滿足,無解回傳-1。


如果陣列沒有排序好,那麼可以用二分搜尋法,從下邊界1和上邊界n去砍半夾擠k值,如果某回合剛好發現有k個元素素 >= k,那麼當下的k值就是答案;如果最後都不滿足,無解回傳-1。


程式碼 排序法

# Option_#1: Sorting

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

# Keep nums sorted in ascending order
nums.sort()

n = len(nums)

if nums[0] >= n:
# First element is smaller than or equal to n
# There are exactly n elements larger than or equal to n
return n

for i in range(1, n):

# Number of elements on index from i to n-1
counting = n-i

if nums[i-1] < counting <= nums[i]:
# Exact element on i-th index is larger than or equal to counting
# There are exactly counting elements (from i-th index to n-1 th index) larger than or equal to counting
return counting

return -1

程式碼 二分搜尋法

# Option_#2: Binary search
class Solution:
def specialArray(self, nums: List[int]) -> int:

def check(k):
# Counting how many number >= k
return sum( 1 for number in nums if number >= k )
# ------------------------------------------

# Launch binary search to find k, such that there are exactly k number >= k in input array.
lower, upper = 1, len(nums)

while lower <= upper:

mid = lower + (upper - lower)//2

count_of_larger_equal = check(k=mid)
if count_of_larger_equal == mid:
return mid

elif count_of_larger_equal > mid:
# mid is too small
# try larger next round
lower = mid+1

else:
# mid is too large
# try smaller nexr round
upper = mid-1

return -1

複雜度分析

時間複雜度: O( n log n)

排序法排序耗費O(n log n),接著線性掃描耗費O(n),總時間成本依然為O(n log n)

二分搜尋法外層耗費O( log n),內層線性掃描耗費O(n),總時間成本為O( n log n)


空間複雜度: O(1)

兩種方法所用到的皆為固定尺寸的臨時變數,皆為常數級別O(1)。


關鍵知識點

如果解空間具有遞增或遞減的性質(近似於已排序),可以用二分搜尋法加快搜尋效率


Reference

[1] Special Array With X Elements Greater Than or Equal X - LeetCode

85會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
這篇文章,會帶著大家複習以前學過的二分搜尋法(Binary Search)框架, 並且以二分搜尋法的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個實用的演算法框架。 Binary search 二分搜尋法框架 用途: 在已經排序好的數列中尋找目標值。
找出區間[1, n] 內的軸心點位置。通過介紹直覺法、改良直覺法和二分搜尋等算法,最終給出了解析解(推導軸心點的公式解),提供了對應的程式碼和參考資料。該問題的最優解是使用解析解,能夠在O(1)的時間複雜度內找到答案。
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
現代人都很忙~只要花少許時間~ 就可以知道實物的可動度及實體與官方照片的差異! 給有想買的人參考!
Thumbnail
長榮(2603)股價大跌的原因或許是因為配息由前次的70元驟降至10元,令投資人失望了。然而對我們而言則不以此武斷地作出投資決策,我們用財報數字來作檢討吧! 下表我們把長榮2023.Q3及Q4的財報數字作對比檢討,並且拉上陽明來作對照組。
Thumbnail
讓00940幫忙抬轎,我的心得分享 重點族群觀測與複盤:華建、華榮、大山、世德、太普高⊖ 前一週投信大戶佈局個股:鈊象、華擎、鈺德、達興材料⊖
Thumbnail
明明都有按時洗頭跟護髮,為什麼頭皮還總是出油、搔癢、長痘痘、頭皮屑甚至落髮狀況越來越嚴重,髮量還變少? 相信許多人都有這樣的認知,以為只要靠洗髮精清潔就不會有任何頭皮問題,甚至洗頭時間很短也不確實,但卻願意花費很多時間及金錢去染燙或保養頭髮,只為保持外觀的美麗,或是髮絲的柔順及健康,卻往往忽略
Thumbnail
在個股中,表現最好的有華通、群光、長榮、陽明分別上漲約1成左右;表現最差的是廣積(-5.6%)、金居(-2.6%)。對比這兩週的觀察,投信持續買超的個股包括:華通、京元電子、群光、長榮、欣銓、瑞儀,以下看看他們的線型。
Thumbnail
美國《外國公司問責法案》是搬石頭砸腳,雖然「中概股」公司面臨退市風險,面臨美股退市、或到香港、澳門、日本二次上市、或增加審計成本的接受PCAOB審計。但真正受害的是重金押注中國企業的美國投資者;因為摘牌驅逐,導致三家電信企業股價下挫,美國投資者皆拋售慘賠,而中、外投資易者正好低接大賺。
Thumbnail
​ 開業於民國六十年(SINCE   1971),傳承三代至今年滿五十年之久老字號的福圓號,是一家專賣中式餐點店家。店方有賣二十五種口味饅頭、十七種口味包子、豆漿、雜糧、堅果等種類店家。在大台北區域的台北、新北、基隆三縣市,目前加總有二十四家門市,多種中式餐點真的讓人吃不膩。如果你是個饅頭或是包子的
Thumbnail
回顧過往勞資對抗史,財力弱勢的選手方卻更常被視為貪婪或是被寵壞的一方。對於這點,生涯累積超過300勝的名人堂巨腕Tom Glavine肯定知之甚詳,因為他不但是1990年代球員工會最傑出的選手代表之一,更親身參與了橫跨1994年到1995年的大罷工談判...
Thumbnail
全台灣第一條高品質鹽燈(鹽晶燈)專用電線,防雷擊過載之斷電開關(無熔絲開關)插頭,保固三年,經濟部標準檢驗局安全認證,耐高溫E12電木燈頭,插頭防過載、漏電,防雷擊、斷電。 每一條鹽燈的電線組都是台灣製造的,並且經過經濟部標準檢驗局安全認證(如圖),使用耐高溫E12電木燈頭(非外面ㄧ般的塑膠燈頭),
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
現代人都很忙~只要花少許時間~ 就可以知道實物的可動度及實體與官方照片的差異! 給有想買的人參考!
Thumbnail
長榮(2603)股價大跌的原因或許是因為配息由前次的70元驟降至10元,令投資人失望了。然而對我們而言則不以此武斷地作出投資決策,我們用財報數字來作檢討吧! 下表我們把長榮2023.Q3及Q4的財報數字作對比檢討,並且拉上陽明來作對照組。
Thumbnail
讓00940幫忙抬轎,我的心得分享 重點族群觀測與複盤:華建、華榮、大山、世德、太普高⊖ 前一週投信大戶佈局個股:鈊象、華擎、鈺德、達興材料⊖
Thumbnail
明明都有按時洗頭跟護髮,為什麼頭皮還總是出油、搔癢、長痘痘、頭皮屑甚至落髮狀況越來越嚴重,髮量還變少? 相信許多人都有這樣的認知,以為只要靠洗髮精清潔就不會有任何頭皮問題,甚至洗頭時間很短也不確實,但卻願意花費很多時間及金錢去染燙或保養頭髮,只為保持外觀的美麗,或是髮絲的柔順及健康,卻往往忽略
Thumbnail
在個股中,表現最好的有華通、群光、長榮、陽明分別上漲約1成左右;表現最差的是廣積(-5.6%)、金居(-2.6%)。對比這兩週的觀察,投信持續買超的個股包括:華通、京元電子、群光、長榮、欣銓、瑞儀,以下看看他們的線型。
Thumbnail
美國《外國公司問責法案》是搬石頭砸腳,雖然「中概股」公司面臨退市風險,面臨美股退市、或到香港、澳門、日本二次上市、或增加審計成本的接受PCAOB審計。但真正受害的是重金押注中國企業的美國投資者;因為摘牌驅逐,導致三家電信企業股價下挫,美國投資者皆拋售慘賠,而中、外投資易者正好低接大賺。
Thumbnail
​ 開業於民國六十年(SINCE   1971),傳承三代至今年滿五十年之久老字號的福圓號,是一家專賣中式餐點店家。店方有賣二十五種口味饅頭、十七種口味包子、豆漿、雜糧、堅果等種類店家。在大台北區域的台北、新北、基隆三縣市,目前加總有二十四家門市,多種中式餐點真的讓人吃不膩。如果你是個饅頭或是包子的
Thumbnail
回顧過往勞資對抗史,財力弱勢的選手方卻更常被視為貪婪或是被寵壞的一方。對於這點,生涯累積超過300勝的名人堂巨腕Tom Glavine肯定知之甚詳,因為他不但是1990年代球員工會最傑出的選手代表之一,更親身參與了橫跨1994年到1995年的大罷工談判...
Thumbnail
全台灣第一條高品質鹽燈(鹽晶燈)專用電線,防雷擊過載之斷電開關(無熔絲開關)插頭,保固三年,經濟部標準檢驗局安全認證,耐高溫E12電木燈頭,插頭防過載、漏電,防雷擊、斷電。 每一條鹽燈的電線組都是台灣製造的,並且經過經濟部標準檢驗局安全認證(如圖),使用耐高溫E12電木燈頭(非外面ㄧ般的塑膠燈頭),