頭角崢嶸 恰好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

52會員
340內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
XESRAY 榮耀之戰 黑牛 牛頭人[2分鐘簡易開箱]現代人都很忙~只要花少許時間~ 就可以知道實物的可動度及實體與官方照片的差異! 給有想買的人參考!
Thumbnail
avatar
奶茶倫的玩具世界
2024-05-05
【2603長榮】投資檢討與展望長榮(2603)股價大跌的原因或許是因為配息由前次的70元驟降至10元,令投資人失望了。然而對我們而言則不以此武斷地作出投資決策,我們用財報數字來作檢討吧! 下表我們把長榮2023.Q3及Q4的財報數字作對比檢討,並且拉上陽明來作對照組。
Thumbnail
avatar
小股東彼得
2024-03-17
【0313米勒投資日報】讓00940幫忙抬轎,我的心得分享;重點族群觀測與複盤:華建、華榮、大山、世德、太普高⊖讓00940幫忙抬轎,我的心得分享 重點族群觀測與複盤:華建、華榮、大山、世德、太普高⊖ 前一週投信大戶佈局個股:鈊象、華擎、鈺德、達興材料⊖
Thumbnail
avatar
Miller
2024-03-13
【解決頭皮問題,讓髮絲更健康】中草藥頭皮養護|頭皮檢測|內含流程與價目表 明明都有按時洗頭跟護髮,為什麼頭皮還總是出油、搔癢、長痘痘、頭皮屑甚至落髮狀況越來越嚴重,髮量還變少? 相信許多人都有這樣的認知,以為只要靠洗髮精清潔就不會有任何頭皮問題,甚至洗頭時間很短也不確實,但卻願意花費很多時間及金錢去染燙或保養頭髮,只為保持外觀的美麗,或是髮絲的柔順及健康,卻往往忽略
Thumbnail
avatar
花葉頭皮養護
2024-03-08
【米勒周選0917】華通、群光、長榮、陽明、正德、晶豪科等本週上漲約1成;觀察投信和大戶本週佈局焦點在個股中,表現最好的有華通、群光、長榮、陽明分別上漲約1成左右;表現最差的是廣積(-5.6%)、金居(-2.6%)。對比這兩週的觀察,投信持續買超的個股包括:華通、京元電子、群光、長榮、欣銓、瑞儀,以下看看他們的線型。
Thumbnail
avatar
Miller
2023-09-17
美國《外國公司問責法案》是搬石頭砸腳的讓美國投資者慘賠─美中經濟(32)美國《外國公司問責法案》是搬石頭砸腳,雖然「中概股」公司面臨退市風險,面臨美股退市、或到香港、澳門、日本二次上市、或增加審計成本的接受PCAOB審計。但真正受害的是重金押注中國企業的美國投資者;因為摘牌驅逐,導致三家電信企業股價下挫,美國投資者皆拋售慘賠,而中、外投資易者正好低接大賺。
Thumbnail
avatar
陳華夫hwafuchen
2020-12-20
[台北美食]開業近五十年老字號福圓號,一家老麵發酵製作的養生饅頭,多達二十七種口味,讓人吃不膩​ 開業於民國六十年(SINCE   1971),傳承三代至今年滿五十年之久老字號的福圓號,是一家專賣中式餐點店家。店方有賣二十五種口味饅頭、十七種口味包子、豆漿、雜糧、堅果等種類店家。在大台北區域的台北、新北、基隆三縣市,目前加總有二十四家門市,多種中式餐點真的讓人吃不膩。如果你是個饅頭或是包子的
Thumbnail
avatar
bravejim
2020-07-28
【頭條焦點】「鐵面左腕」Tom Glavine:就算理由百分百正當、球員仍難逃貪婪觀感?!回顧過往勞資對抗史,財力弱勢的選手方卻更常被視為貪婪或是被寵壞的一方。對於這點,生涯累積超過300勝的名人堂巨腕Tom Glavine肯定知之甚詳,因為他不但是1990年代球員工會最傑出的選手代表之一,更親身參與了橫跨1994年到1995年的大罷工談判...
Thumbnail
avatar
正義鷹大俠
2020-05-21
鹽燈電線~全台灣第一條高品質鹽燈(鹽晶燈)專用電線~防雷擊過載之斷電開關插頭,經濟部標準檢驗局安全認證,耐高溫E12電木燈頭(無熔絲開關,不含燈泡)全台灣第一條高品質鹽燈(鹽晶燈)專用電線,防雷擊過載之斷電開關(無熔絲開關)插頭,保固三年,經濟部標準檢驗局安全認證,耐高溫E12電木燈頭,插頭防過載、漏電,防雷擊、斷電。 每一條鹽燈的電線組都是台灣製造的,並且經過經濟部標準檢驗局安全認證(如圖),使用耐高溫E12電木燈頭(非外面ㄧ般的塑膠燈頭),
Thumbnail
avatar
鹽燈專家【鹽晶王】
2016-10-07