问题:给定一个有序组的旋转和一个目标值,返回目标值在该数组的下标,如果没有,返回-1.假设该数组没有重复值。
依然使用二分查找法,OC算法实现:
//
// SearchRotation.h
// Algorithm
//
// Created by han shuai on 2016/9/27.
// Copyright © 2016年 han shuai. All rights reserved.
//
<p class="p1"><span class="s1">/**</span></p><p class="p1"><span class="s1"> 17</span></p><p class="p1"><span class="s1"> */</span></p>
#import <Foundation/Foundation.h>
@interface SearchRotation : NSObject
- (NSInteger)searchRotation:(NSArray *)dataArr target:(int)target;
@end
//
// SearchRotation.m
// Algorithm
//
// Created by han shuai on 2016/9/27.
// Copyright © 2016年 han shuai. All rights reserved.
//
#import "SearchRotation.h"
@implementation SearchRotation
- (NSInteger)searchRotation:(NSArray *)dataArr target:(int)target
{
NSInteger left = 0;
NSInteger right = dataArr.count-1;
NSInteger mid = 0;
while (left<right) {
mid = (left+right)/2;
if (dataArr[mid]>dataArr[left]) {
//左半部分有序
if (target == [dataArr[mid] intValue]) {
return mid;
}
else if (target> [dataArr[left] intValue] && target<[dataArr[mid] intValue])
{
//目标数落在在有序列
right = mid;
}
else if (target== [dataArr[left] intValue])
{
return left;
}
else
{
//目标数落在无序列
left = mid;
}
}
else
{
//右半部分有序
if (target == [dataArr[mid] intValue]) {
return mid;
}
else if (target > [dataArr[mid] intValue] && target < [dataArr[right] intValue])
{
//目标落在有序列
left = mid;
}
else if (target == [dataArr[right] intValue])
{
return right;
}
else
{
//目标落在无序列
right = mid;
}
}
}
return -1;
}
@end