剑指offer-求旋转数组的最大最小数值

/*******************************************************************
Copyright(c) 2016, Harry He
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//

/* 
Q:
    旋转数组最大最小问题。
    把一个数组的最开始若干个元素搬到数组的末尾,我们称之为数组的旋转,
    输入一个递增排序的数组的旋转数组,输出旋转数组的最小(最大)元素,
    例如:
        输入:{3,4,5,1,2}
        输出:1
*/

#include <iostream>
#include <cstdio>

int minInOrder(int arr[], int index_1, int index_2)
{
    int result = *(arr + index_1);
    for(int i = index_1 + 1; i <= index_2; ++i)
    {
        if(*(arr + i) < result)
            result = *(arr + i);
    }
    return result;
}

int maxInOrder(int arr[], int index_1, int index_2)
{
    int result = *(arr + index_1);
    for(int i = index_1 + 1; i <= index_2; ++i)
    {
        if(*(arr + i) > result)
            result = *(arr + i);
    }
    return result;
}

int rotatedMin(int arr[], int length)
{
    if(arr == nullptr || length <= 0)
    {
        std::cout << "arrar error!" << std::endl;
        exit(1);
    }

    int index_1 = 0;
    int index_2 = length - 1;
    int midIndex = index_1;
    while(*(arr + index_1) >= *(arr + index_2))
    {
        if(index_2 - index_1 == 1)
        {
            midIndex = index_2;
            break;
        }
        midIndex = (index_1 + index_2) / 2;
        if(*(arr + midIndex) == *(arr + index_1) && *(arr + midIndex) == *(arr + index_2))
            return minInOrder(arr, index_1, index_2);
        if(*(arr + midIndex) >= *(arr + index_1))
            index_1 = midIndex;
        if(*(arr + midIndex) <= *(arr + index_2))
            index_2 = midIndex;
    }
    return *(arr + midIndex);
}

int rotatedMax(int arr[], int length)
{
    if(arr == nullptr || length <= 0)
    {
        std::cout << "arrar error!" << std::endl;
        exit(1);
    }

    int index_1 = 0;
    int index_2 = length - 1;
    int midIndex = index_2;
    while(*(arr + index_1) >= *(arr + index_2))
    {
        if(index_2 - index_1 == 1)
        {
            midIndex = index_1;
            break;
        }
        midIndex = (index_1 + index_2) / 2;
        if(*(arr + midIndex) == *(arr + index_1) && *(arr + midIndex) == *(arr + index_2))
            return maxInOrder(arr, index_1, index_2);
        if(*(arr + midIndex) >= *(arr + index_1))
            index_1 = midIndex;
        if(*(arr + midIndex) <= *(arr + index_2))
            index_2 = midIndex;
    }
    return *(arr + midIndex);
}

void test_rotatedMin()
{
    int arr[] = {3,4,5,1,2};
    int result = rotatedMin(arr, 5);
    std::cout << "found min value = " << result << std::endl;
    result = rotatedMax(arr, 5);
    std::cout << "found max value = " << result << std::endl;

    int arr_2[] = {1,0,1,1,1};
    result = rotatedMin(arr_2, 5);
    std::cout << "found min value = " << result << std::endl;
    result = rotatedMax(arr_2, 5);
    std::cout << "found max value = " << result << std::endl;

    int arr_3[] = {1,1,1,0,1};
    result = rotatedMin(arr_3, 5);
    std::cout << "found min value = " << result << std::endl;
    result = rotatedMax(arr_3, 5);
    std::cout << "found max value = " << result << std::endl;

    int arr_4[] = {3, 6, 6, 9, 0};
    result = rotatedMin(arr_4, 5);
    std::cout << "found min value = " << result << std::endl;
    result = rotatedMax(arr_4, 5);
    std::cout << "found max value = " << result << std::endl;

    int arr_5[] = {3, 6, 6, 9, 10};
    result = rotatedMin(arr_5, 5);
    std::cout << "found min value = " << result << std::endl;
    result = rotatedMax(arr_5, 5);
    std::cout << "found max value = " << result << std::endl;
}

int main(int argc, char**argv)
{

    test_rotatedMin();

    return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值