1. 程式人生 > >面試題38:數字在排序陣列中出現的次數

面試題38:數字在排序陣列中出現的次數

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