题目:
把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。例如数组
{3,4, 5, 1, 2 }
为{ 1,2,3, 4,5}
的一个旋转,该数组的最小值为1
解答:
#import <Foundation/Foundation.h>
// 遍历 获取 最小值
NSInteger minInorder(NSArray <NSNumber *>*valueArray) {
if (valueArray.count == 0) {
return -1;
}
NSInteger minValue = valueArray[0].integerValue;
for (NSInteger tmpIndex = 1; tmpIndex < valueArray.count; tmpIndex++) {
if (minValue > valueArray[tmpIndex].integerValue) {
minValue = valueArray[tmpIndex].integerValue;
}
}
return minValue;
}
// 获取 最小值
NSInteger minValue(NSArray <NSNumber *>*valueArray) {
if (valueArray.count == 0) {
return -1;
}
if (valueArray.count == 1) {
return valueArray[0].integerValue;
}
NSInteger startIndex = 0;
NSInteger endIndex = valueArray.count - 1;
NSInteger middleIndex = startIndex;
while (startIndex <= endIndex) {
if (endIndex - startIndex == 1) {
return valueArray[endIndex].integerValue;
}
middleIndex = (startIndex + endIndex)/2;
if (valueArray[startIndex] < valueArray[endIndex]) {
return valueArray[startIndex].integerValue;
}
if (valueArray[middleIndex] == valueArray[startIndex]
&& valueArray[middleIndex] == valueArray[endIndex]) {
return minInorder(valueArray);
}
// 第一个 递增 序列
if (valueArray[middleIndex] >= valueArray[startIndex]) {
startIndex = middleIndex;
}
else if(valueArray[middleIndex] <= valueArray[endIndex]){
endIndex = middleIndex;
}
}
return valueArray[middleIndex].integerValue;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"%ld", minValue(@[@3, @4, @5, @6, @2]));
NSLog(@"%ld", minValue(@[@3, @4, @5, @1, @1, @2]));
NSLog(@"%ld", minValue(@[@3, @4, @5, @1, @2, @2]));
NSLog(@"%ld", minValue(@[@1, @0, @1, @1, @1, @1]));
NSLog(@"%ld", minValue(@[@1, @1, @1, @1, @1, @1]));
NSLog(@"%ld", minValue(@[@1, @2, @3, @4, @5, @6]));
NSLog(@"%ld", minValue(@[@1,]));
}
return 0;
}
网友评论