问题:输入一个递增排序数组的一个旋转,输出旋转数组的最小值。
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