劍指Offer 53 在排序陣列中查詢數字

2021-09-11 03:49:28 字數 2816 閱讀 3016

統計乙個數字在排序陣列**現的次數。

例:

輸入陣列和數字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 函式的邏輯,判斷答案落在左...