你給出乙個整數陣列(size為n),其具有以下特點:
假定p是峰值的位置則滿足a[p] > a[p-1]
且a[p] > a[p+1]
,返回陣列中任意乙個峰值的位置。
給出陣列[1, 2, 1, 3, 4, 5, 7, 6]
返回1
, 即數值 2 所在位置, 或者6
, 即數值 7 所在位置.
time complexity o(logn)
怎麼用二分法呢?猛地想不到,就先想想left和right求取中值mid嘛,這是二分法的通用套路。然後,此時mid所指向的元素的值就分為三種情況了:
1. a[mid] > a[mid + 1] && a[mid] > a[mid - 1],那麼,根據定義,mid指向的就是乙個峰值
2. a[mid] < a[mid + 1],因為a[n - 2] > a[n - 1],那麼,一定有乙個峰值存在於[mid + 1, n - 2]
3. a[mid] < a[mid - 1],因為a[0] < a[1],那麼,一定有乙個峰值存在於[1, mid - 1]
也就是說,我們每次求得mid所指的值,都可以縮減峰值存在的範圍。
class solution:
"""@param a: an integers array.
@return: return any of peek positions.
"""def findpeak(self, a):
# write your code here
#根據資料特點直接判斷
if a[1] > a[2]:
return 1
if a[len(a)-2] > a[len(a) - 3]:
return len(a) - 2
start, end = 0, len(a) - 1
while start <= end:
mid = (start + end) // 2
if a[mid] > a[mid+1] and a[mid] > a[mid -1]:
return mid
if a[mid] < a[mid + 1]:
start = mid + 1
else:
end = mid - 1
return start if a[start] >= a[end] else end
兩次過 Lintcode 75 尋找峰值
你給出乙個整數陣列 size為n 其具有以下特點 假定p是峰值的位置則滿足a p a p 1 且a p a p 1 返回陣列中任意乙個峰值的位置。給出陣列 1,2,1,3,4,5,7,6 返回1,即數值 2 所在位置,或者6,即數值 7 所在位置.time complexity o logn 普通遍...
7 5 尋找大富翁
胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入格式 輸入首先給出兩個正整數n 10 6 和m 10 其中n為總人數,m為需要找出的大富翁數 接下來一行給出n個人的個人資產值,以百萬元為單位,為不超...
尋找重複的數 LintCode
給出乙個陣列 nums 包含 n 1 個整數,每個整數是從 1 到 n 包括邊界 保證至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。注意事項 不能修改陣列 假設陣列只能讀 只能用額外的o 1 的空間 時間複雜度小於o n 2 陣列中只有乙個重複的數,但可能重複超過一次 樣例 給出...