zoukankan      html  css  js  c++  java
  • 二分查找变体之循环有序数组找分界点

    设一个数组循环有序(循环有序满足以下条件之一)

    1.数组所有元素相等

    2.数组是个有序数列,这时候分界点就是第一个元素的位置

    3.总能找到一个位置(也是只有唯一一个位置)从那个位置开始,左边是个递增序列,右边也是一个有序序列,切最后一个元素小于或者等于第一个元素

    求分界点的坐标

    二分查找变体之循环有序数组分界点
    int FindMinEx(int *arr,int size)
    {
    int min = arr[0];
    int beg = 1;
    while(beg<size)
    {
    if(arr[beg]<arr[0])
    {
    return beg;
    }
    ++beg;
    }
    return 0;
    }
    int FindMin(int *arr,int const size)
    {
    int first = arr[0];
    int last = arr[size-1];
    int min = 0;
    int beg = 1;
    int end = size -1;
    while(beg<=end)
    {
    int mid = (beg+end)/2;
    //最小的元素总是在有两个递增子序列的那子序列里
    if(arr[mid]>first)//左边为递增子序列
    {
    beg = mid+1;
    }
    else if(arr[mid]<first)//右边为递增子序列
    {
    end = mid -1;
    if(arr[min]>=arr[mid])
    min = mid;
    }
    else
    {
    if(arr[mid]>last)//左边为递增子序列
    {
    beg = mid+1;
    }
    else
    {
    if(arr[min]>=arr[mid])
    {
    min = mid;
    }
    int iMid = size/2;
    if(iMid>mid)
    {
    beg = mid +1;
    }
    else if(iMid<mid)
    {
    end = mid -1;
    }
    else
    {
    return FindMinEx(arr,size);
    }
    }
    }
    }
    return min;
    }

  • 相关阅读:
    Android教程 -07 Activity的任务栈和启动模式
    ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
    hdu 5900 区间dp
    状压dp入门
    poj 3280
    hdu 4745 two Rabits
    食了智,过来水一发
    poj 2142 the Balance
    hdu 6188 Duizi and Shunzi
    hdu 6186 CS Course
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2209013.html
Copyright © 2011-2022 走看看