統計乙個數字在排序陣列**現的次數。
例:
輸入陣列和數字3。由於3在這個陣列**現了4次,輸出4。遍歷陣列統計。
時間複雜度:o(n)
空間複雜度:o(1)
遍歷統計沒有利用到這是個排序陣列的資訊。因為是排序陣列,所以需要統計的數字i個數等於i_right - i_left + 1。只要找到數字的邊界即可。同時可以利用二分法查詢,先找到乙個i,那麼邊界必然在i左右兩側,然後採取二分法查詢,只要左邊還是i說明,左邊界在左區間,否則在右區間。尋找右邊界同理。
時間複雜度:o(logn)
空間複雜度:o(1)
def
num_of_k
(nums, k)
:"""
:param nums: array
:param k: find k
"""# find middle k
left, right =0,
len(nums)-1
while left <= right:
mid =
(left + right)//2
if nums[mid]
< k:
left = mid +
1elif nums[mid]
> k:
right = mid -
1else
:break
else
:raise exception(
'no such number'
) start_l, start_r = left, mid
end_l, end_r = mid, right
# find start boundary
while start_l <= start_r:
start =
(start_l + start_r)//2
if nums[start]
!= k:
start_l = start +
1else
:if start >
0and nums[start -1]
== k:
start_r = start -
1else
:break
# find end boundary
while end_l <= end_r:
end =
(end_l + end_r)//2
if nums[end]
!= k:
end_r = end -
1else
:if end +
1<
len(nums)
and nums[end +1]
== k:
end_l = end +
1else
:break
return end - start +
1
乙個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。
在範圍0~n-1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。
只需要檢查數字與其下表是否一致。如果一致,說明左側全,如果不一致,說明左側缺數。
時間複雜度:o(logn)
空間複雜度:o(1)
def
missing_num
(nums)
:"""
:param nums: array
:return: missing number
"""left, right =0,
len(nums)-1
while left <= right:
mid =
(left + right)//2
if nums[mid]
== mid:
left = mid +
1else
:if nums[mid -1]
== mid -1:
return mid
right = mid -
1return left
假設乙個單調遞增的陣列裡的每個元素都是整數並且是唯一的。請程式設計實現乙個函式,找出
陣列中任意乙個數值等於其下表的元素。
例:
在陣列中,數字3和它的下標相等。因為是遞增陣列,在n=i的左側必然有n < i,右側必然有n > i。
時間複雜度:o(logn)
空間複雜度:o(1)
def
integer_identical_to_index
(nums)
:"""
:param nums: array
:return: the number equals its index
"""left, right =0,
len(nums)-1
while left <= right:
mid =
(left + right)
>>
1if nums[mid]
< mid:
left = mid +
1elif nums[mid]
> mid:
right = mid -
1else
:break
else
:raise exception(
'no such number'
)return mid
對於排序的陣列常可以考慮用二分法來加速。 劍指Offer 53 在排序陣列中查詢數字
package 劍指offer public class 劍指53 在排序陣列中查詢數字 和數字3,由於3在陣列中出現4次,所以返回結果4 思路 因為陣列是有序的,所以採用二分法查詢,當找到乙個k時,因為可能前面或者後面都有k,如果從當前找的到位置往兩頭開始遍歷,那麼有可能整個陣列為一樣的數,所以時...
劍指offer 53 在排序陣列中查詢數字
給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。思路 看到 排列陣列 第一反應就得是二分查詢。但是一般的二分,如果在中點處剛好找到乙個數等於target,那接下來往哪邊走呢?沒辦法判...
劍指offer 53 在排序陣列中查詢數字
0 n 1中缺失的數字 陣列中數值和下標相等的元素 統計乙個數字在排序陣列 現的次數。例如輸入排序陣列 1,2,3,3,3,3,4,5 和數字 3 由於 3 在這個陣列 現了 4 次,因此輸出 4 整數二分一般寫二分的思考順序是這樣的 首先通過題目背景和check mid 函式的邏輯,判斷答案落在左...