面試題38:數字在排序陣列中出現的次數
阿新 • • 發佈:2018-12-02
6.3 知識遷移能力
描述: 統計一個數字在排序陣列中出現的次數。
solution1. 雜湊
直接利用雜湊表儲存;
時間複雜度是O(n);
解法並不是最優的,而且沒有利用排序陣列這個資訊;
solution2. 二分查詢
利用二分查詢,先找到這個數字,然後再順序遍歷,得到出現的次數;
時間複雜度依然是O(n),不可取;
solution3. 二分查詢改進版
如果我們可以利用二分查詢,找到k出現的第一次和最後一次,問題就解決。
如下:
# -*- coding:utf-8 -*-
class Solution:
def GetFirstIndexOfK(self, data, start, end , k):
if start > end:
return -1
mid = (start + end) // 2
if data[mid] == k:
if mid == 0 or (mid > 0 and data[mid-1] != k) :
return mid
else:
end = mid-1
elif data[mid] < k:
start = mid + 1
else:
end = mid - 1
return self.GetFirstIndexOfK(data, start, end, k)
def GetLastIndexOfK(self, data, start, end, k):
if start > end:
return -1
mid = (start + end) // 2
if data[mid] == k:
if (mid < end and data [mid+1] != k) or mid == end :
return mid
else:
start = mid+1
elif data[mid] < k:
start = mid + 1
else:
end = mid - 1
return self.GetLastIndexOfK(data, start, end, k)
def GetNumberOfK(self, data, k):
# write code here
start = 0
end = len(data)-1
firstIdex = self.GetFirstIndexOfK(data, 0, end, k)
endIdex = self.GetLastIndexOfK(data, 0, end, k)
if firstIdex > -1 and endIdex > -1:
return endIdex - firstIdex + 1
else:
return 0