旋转数组中的最小数字

牛客网上在线编程可能没有太强的限制条件,用了顺序查找,也就是O(n)的算法,竟然也过了,:)
本题的考点是二分查找,一定要熟悉二分查找,时间复杂度可以降低为O(logn)。
本题的思路:
首先按题目的意思,数组是分段有序的,第一段递增序列和第二段递增序列,首先两个指针P1和P2,P1 行走在第一段递增序列中,P2行走在第二段递增序列之中,当P2指向第二段的第一个,P1指向第一段的最后一个,则求出了答案。
和二分查找相似,每次找出中值,如果中值>P1的值,说明中值属于第一段,这样应该将P1移到中值处,如果中值<= P2的值,说明中值处于第二段,P2移到该处。终止条件:P2-P1=1,返回P2.

因为P1和P2总是向中值靠拢,所以最后一定可以求出值来。


image.png
# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        index1 = 0
        index2 = len(rotateArray) - 1
        indexMid = index1
        while rotateArray[index1] >= rotateArray[index2]:
            if index2 - index1 == 1:
                indexMid = index2
                break
            indexMid = (index1 + index2) / 2
            if rotateArray[indexMid] >= rotateArray[index1]:
                index1 = indexMid
            else:
                index2 = indexMid
        return rotateArray[indexMid]
        

C++:
对有序的数组,要注意,二分查找

class Solution {
public:
    int minNumberInRotateArray(vector rotateArray) {
        int  p1 = 0;
        int p2 = rotateArray.size() - 1;
        if(rotateArray[p2] > rotateArray[p1]) return rotateArray[p1];
        while(p2 - p1 > 1){
            int left = rotateArray[p1];
            int right = rotateArray[p2];
            int mid = rotateArray[(p1 + p2) / 2];
            if(mid >= left) p1 = (p1 + p2) / 2;
            if(mid <= right) p2 = (p1 + p2) / 2;
        }
        return rotateArray[p2];
    }
};

你可能感兴趣的:(旋转数组中的最小数字)