zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数

    题目描述

    统计一个数字在排序数组中出现的次数。
    思路:
    采用二分查找,因为数组是排序的,所以找到第一次出现的地方,和最后一次出现的地方,相减加1即为出现次数
    注意的点:
    1.变量的边界值,mid+1,mid-1是否越界
    2,左边没找到,右边没找到,如果都返回0,就和左边找到的索引是0,右边找到的索引也是0,就很难区分是哪种情况,所以,没找到返回-1,找到返回索引。
    3.递归调用的地方注意写return
    4,注意判断,要start<=end
     
     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     def GetNumberOfK(self, data, k):
     4         # write code here
     5         # 采用折半查找思路
     6         if len(data) == 0:
     7             return 0
     8         # if k not in data:
     9         #     return 0
    10         left = self.findHalf1(data, 0, len(data) - 1, k)
    11         right = self.findHalf2(data, 0, len(data) - 1, k)
    12         if left==-1 and right==-1:
    13             return 0
    14         return right - left + 1
    15 
    16     def findHalf1(self, data, start, end, k):
    17         if start>end:
    18             return -1
    19         mid = (start + end) >> 1
    20         if data[mid] > k:  # 中间的值比k大
    21             if mid == 0:
    22                 return -1
    23             end = mid-1
    24 
    25         if data[mid] < k:
    26             if mid == len(data)-1:
    27                 return -1
    28             start = mid + 1
    29         if data[mid] == k:
    30             if mid ==0 or data[mid - 1] != k:
    31                 return mid
    32             else:
    33                 end = mid - 1
    34 
    35         return self.findHalf1(data, start, end, k)
    36 
    37     def findHalf2(self, data, start, end, k):
    38         if start > end:
    39             return -1
    40         mid = (start + end) >> 1
    41         if data[mid] > k:  # 中间的值比k大
    42             if mid == 0:
    43                 return -1
    44             end = mid - 1
    45         if data[mid] < k:
    46             if mid == len(data)-1:
    47                 return -1
    48             start = mid + 1
    49         if data[mid] == k:
    50             if mid+1 == len(data) or data[mid + 1] != k :
    51                 return mid
    52             else:
    53                 start = mid + 1
    54         return self.findHalf2(data, start, end, k)
  • 相关阅读:
    HttpClient-----待补充
    JDK8的新特性
    关于日期转换的知识点(SimpleDateFormat)
    mybatis中的增删改查操作
    mybatis的快速入门
    018 HDFS中,namenode与datanode的交互
    Unit的各种断言
    分组数据
    Javassist学习总结
    hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)
  • 原文地址:https://www.cnblogs.com/shuangcao/p/12786837.html
Copyright © 2011-2022 走看看