二分查找 变形

#include<iostream>
using namespace std;

int helper(int a[],int len,int t,bool isleft)
{
    if(a == NULL || 0 >= t) return EOF;

    int last = EOF;
    int left = 0;
    int right = len - 1;

    while(left <= right)
    {
        int middle = (left + right)/2;
        if(a[middle] > t)
        {
          right = middle - 1;
        }
        else if(a[middle]<t)
        {
          left = middle + 1;
        }else{
          last = middle;
          if(isleft)
              right = middle-1;
          else
              left = middle + 1;
        }
    }
    return last;
}

int main()
{
    int a[] = {1,1,2,2,2,2,3,4,5};
    int left = helper(a,sizeof(a)/sizeof(a[0]),2,true);
    int right = helper(a,sizeof(a)/sizeof(a[0]),2,false);
    if(EOF != left && EOF != right)
        cout<<left<<" "<<right<<" "<<right-left + 1<<endl;
    else
        cout<<left<<" "<<right<<" "<<"can not found"<<endl;

}
#include<stdio.h>

int solver(const int a[],const int n,const int t)
{
  int total = 0;
  if (NULL == a && 0 >= n)
      return total;
  int start = 0;
  int end = n-1;
  while(start <= end)
  {
   printf("%d   %d
",start,end);
   int middle = (start + end)/2;
   if(t == a[middle])
   {
     total = 1;
     int cursor = 0;
     while(++cursor && middle + cursor < n && t == a[middle + cursor])
       total++;
     cursor = 0;
     while(--cursor && middle + cursor >= 0 && t == a[middle + cursor])
        total++;
     return total;
   }
   else if(t > a[middle])
    end = middle - 1;
   else
    start = middle + 1;
  }
  return total;
}

int main()
{
    int a[] = {1,1,1,1,1,1};
    int b[] = {1,2,2,2,2,3};
    int c[] = {1,2,3,5,6,7};
    printf("%d",solver(b,6,4));
}
berkeleysong
原文地址:https://www.cnblogs.com/berkeleysong/p/3733954.html