1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution: def GetNumberOfK(self, data, k): if len(data) < 1: return 0 firstk, lastk = self.getFirstK(data, k), self.getLastK(data, k) if firstk == -1: return 0 else: return lastk - firstk + 1 def getFirstK(self, data, k): min_idx, max_idx = 0, len(data) - 1 while True: mid_idx = (max_idx + min_idx) // 2 if data[mid_idx] < k: min_idx = mid_idx + 1 elif data[mid_idx] > k: max_idx = mid_idx - 1 elif mid_idx > 0 and data[mid_idx - 1] == k: max_idx = mid_idx - 1 else: return mid_idx if max_idx < min_idx: return -1 def getLastK(self, data, k): min_idx, max_idx = 0, len(data) - 1 while True: mid_idx = (max_idx + min_idx) // 2 if data[mid_idx] < k: min_idx = mid_idx + 1 elif data[mid_idx] > k: max_idx = mid_idx - 1 elif mid_idx < len(data) - 1 and data[mid_idx + 1] == k: min_idx = mid_idx + 1 else: return mid_idx if max_idx < min_idx: return -1
|