統計乙個數字在排序陣列中出現的次數。
既然輸入的陣列是排序的,那麼我們很自然地可以想到用二分查詢演算法。我們可以先用二分查詢演算法找到乙個k,然後在找到的k的左右兩邊順序掃瞄。因為要查詢的數字在長度為n的陣列中有可能出現了n次,所以順序掃瞄的時間複雜度是o(n)。這樣和直接掃瞄整個陣列進行統計的效率是一樣的,顯然並不好。
如何更好地利用二分查詢演算法…
我們可以利用二分查詢演算法確定第乙個k和最後乙個k的位置,然後就可以計算出k在陣列中出現的次數了。
# -*- coding:utf-8 -*-
class
solution:
defgetfirstk
(self, data, k, start, end):
if start > end:
return -1
middle_index = int((start + end) / 2)
if data[middle_index] > k:
end = middle_index - 1
elif data[middle_index] < k:
start = middle_index + 1
else:
if middle_index > 0
and data[middle_index - 1] != k or middle_index == 0:
return middle_index
else:
end = middle_index - 1
return self.getfirstk(data, k, start, end)
defgetlastk
(self, data, k, start, end):
if start > end:
return -1
middle_index = int((start + end) / 2)
if data[middle_index] > k:
end = middle_index - 1
elif data[middle_index] < k:
start = middle_index + 1
else:
if middle_index < len(data) - 1
and data[middle_index + 1] != k or middle_index == len(data) - 1:
return middle_index
else:
start = middle_index + 1
return self.getlastk(data, k, start, end)
defgetnumberofk
(self, data, k):
# write code here
number = 0
if data:
start = self.getfirstk(data, k, 0, len(data) - 1)
end = self.getlastk(data, k, 0, len(data) - 1)
if start != -1
and end != -1:
number = end - start + 1
return number
數字在排序陣列中出現次數
統計乙個數字在排序陣列中出現的次數。思路 求乙個數字在這個排序陣列中出現的次數,首先想到的是使用二分查詢,當我找到乙個位置,然後往前就可以到達最前面第乙個出現該數字的位置,往後就可以到達最後面最後乙個出現該數字的位置,然後兩個位置相減此時就得到該數字出現的次數。但是問題在於我用二分查詢到位置後,然後...
數字在排序陣列中出現的次數
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 統計乙個數字在排序陣列中出現的次數。輸入 每個測試案例包括兩行 第一行有1個整數n,表示陣列的大小。1 n 10 6。第二行有n個整數,表示陣列元素,每個元素均為int。第三行有1個整數m,表示接下來有m次查詢。1 m 10 ...
數字在排序陣列中出現的次數
題目 統計乙個數字下排序陣列中出現的次數。例如輸入排序陣列和數字3,由於3在這個陣列中出現了4次,因此輸出4。當然第一眼就能想到遍歷這個陣列然後統計這個陣列中某個數字出現的次數。當然第一眼就能想到的方法通常來說效率都不怎麼樣 再稍微想一下這個題目,是乙個已序的陣列,所以呢,不難想到二分查詢。我們可以...