• 统计一个数组在排序数组中出现的次数,C++,二分查找


    在排序数组中查找很容易想到的就是二分查找,这样的查找效率是相当高的。

    找到之后,再在这个数的周围向左或者向右进行延伸,查找有多少个相同的数字。

    这次编程主要遇到的问题就是,对二分查找的要点已经忘得差不多了,所以特意写个博客记录。

    这个数组中本身含有想要查找的数字很简单,设定三个值,left,middle,right。如果array【middle】>k,就更新right=middle。类似的查找,可以看下面的代码。

    难点在于,数组中并没有想要查找的数字,这时候就要分情况讨论

    一、要查找的数字比所有的数字都小

    二、要查找的数字比所有的数字都大

    三、要查找的数字在范围内,但是却没有这个数字。这时候,根据上面的查找算法,加入说,要查找7这个数字,数组内部是{6,8};这时候

    1)array[left] = 6,array[right] = 8;middle = (left + right)/2.所以array[middle]=6(middle 等于 left);

    这时候array[middle]<7,按照算法,应该left=middle,但是这样的话就会陷入死循环。所以应该判断当left=middle的时候,不进行赋值,退出;

    2)同样是查找7这个数字,但是数组是{6,8,9};

    这时候array[middle]=8>7,right赋值为middle,接着陷入之前的境地。

    代码如下:

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 class Solution {
     5 public:
     6     int GetNumberOfK(vector<int> data ,int k) {
     7         if (data.size() == 0 || data[0] > k || data[data.size() - 1] < k)
     8         {
     9             return 0;
    10         }
    11         int left = 0;
    12         int right = data.size();
    13         int middle = (left + right)/2;
    14         while (true)
    15         {
    16             if (data[middle] == k)
    17             {
    18                 break;
    19                 //如果中间数比k还大的话,就应该去小的一部分数字中寻找 
    20             } else if (data[middle] > k) {
    21                 right = middle;
    22             } else {
    23                 if (left == middle)
    24                 {
    25                     return 0;
    26                 }
    27                 left = middle;
    28             }
    29             middle = (left + right) /2;
    30         }
    31         left = middle - 1;
    32         right = middle + 1;
    33         int count = 1;
    34         while (left >= 0 && data[left--] == k)
    35         {
    36             count++;
    37         }
    38         while (right < data.size() && data[right++] == k)
    39         {
    40             count++;
    41         }
    42         return count;
    43     }
    44 };
    45 int main()
    46 {
    47     int array[6] = {3,3,3,3,4,5};
    48     vector<int> vec(array, array + 6);
    49     cout<<Solution().GetNumberOfK(vec, 3)<<endl;
    50     return 0;
    51 }
  • 相关阅读:
    IBM实习
    软件测试——一些想法
    ftp文件上传下载实用命令
    Json解析,Json-lib
    eclipse Swt编程—窗口小部件widget
    Java 泛型
    我的理想与现实
    Java泛型介绍——HashMap总结
    Java语言面向对象的一些基本特点
    Java的一些常见问题,JRE,JDK,JVM,包等概念理解
  • 原文地址:https://www.cnblogs.com/adamhome/p/7941947.html
Copyright © 2020-2023  润新知