【剣指offer】38.ソート配列に数値が表示される回数(python)

5873 ワード

タイトルの説明
ソート配列に表示される数値の回数を統計します.
構想
『剣指offer』P 204は二分法を用いて統計を検討している.
  • 第1回二分法は、この数字が現れる位置pos
  • を見つけた.
  • はそれぞれposの左右の両側の配列を複数回二分して検索し、首尾が現れる位置を見つけた.

  • 注意:kが配列に存在しない場合.
    code
    # -*- coding:utf-8 -*-
    class Solution:
        def GetNumberOfK(self, data, k):
            # write code here
            if not data:
                return 0
            start = 0
            end = len(data) - 1
            #    k     
            index = self.binaryFind(data, start, end, k)
            if index == -1:
                return 0
            indexLeft = index
            indexRight = index
            #          
            while indexLeft > 0 and data[indexLeft - 1] == k:
                indexLeft = self.binaryFind(data, 0, indexLeft - 1, k)
            while indexRight < end and data[indexRight + 1] == k:
                indexRight = self.binaryFind(data, indexRight + 1, end, k)
            return indexRight - indexLeft + 1
            
        def binaryFind(self, data, left, right, k):
            while left <= right:
                mid = (right + left) / 2
                if data[mid] > k:
                    right = mid - 1
                elif data[mid] < k:
                    left = mid + 1
                else:
                    return mid
            return -1