旋转数组最小值

本文介绍了一种使用二分查找算法来确定旋转递增排序数组中最小值的方法。通过不断缩小搜索范围,直到找到最小值所在位置。

问题:输入一个递增排序数组的一个旋转,输出旋转数组的最小值。

OC根据二分查找实现的算法:

//
//  MinOfRotation.h
//  Algorithm
//
//  Created by han shuai on 2016/9/26.
//  Copyright © 2016年 han shuai. All rights reserved.
//
<p class="p1"><span class="s1">/**</span></p><p class="p1"><span class="s1"> 16</span></p><p class="p1"><span class="s1"> */</span></p>
#import <Foundation/Foundation.h>

@interface MinOfRotation : NSObject

- (int)minOfRotation:(NSArray *)dataArr;

@end

//
//  MinOfRotation.m
//  Algorithm
//
//  Created by han shuai on 2016/9/26.
//  Copyright © 2016年 han shuai. All rights reserved.
//

#import "MinOfRotation.h"
#include <math.h>

@implementation MinOfRotation

- (int)minOfRotation:(NSArray *)dataArr
{
    NSInteger left = 0;
    NSInteger right = dataArr.count-1;
    NSInteger mid = 0;
    while (left < right) {
        mid = (left+right)/2;
        //如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。
        //此时该数组中最小的元素应该位于该中间元素的前面
        if ([dataArr[mid] intValue] < [dataArr[left] intValue]) {
            //我们可以把第二个指针指向该中间元素
            right = mid;
        }
        //如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素
        //此时数组中最小的元素应该位于该中间元素的后面
        else if ([dataArr[mid] intValue] > [dataArr[left] intValue])
        {
            //我们可以把第一指针指向该中间元素
            left = mid;
        }
        else
        {
            //中间元素和左边元素相等时,则找到了目标元素
            //它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素
            break;
        }
    }
    //第二个指针指向的刚好是最小的元素
    return [dataArr[right] intValue];
}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值