美文网首页
【剑指Offer学习】【面试题8 : 旋转数组的最小数字】

【剑指Offer学习】【面试题8 : 旋转数组的最小数字】

作者: 林大鹏 | 来源:发表于2018-01-26 09:30 被阅读12次

题目:

把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。例如数组{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;
}

相关文章

网友评论

      本文标题:【剑指Offer学习】【面试题8 : 旋转数组的最小数字】

      本文链接:https://www.haomeiwen.com/subject/zjdiaxtx.html