剑指offer-06 旋转数组的最小数字

剑指offer-06 旋转数组的最小数字

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

题目类别

解题思路

一开始的思路是从前向后比较,直到出现递减。但是还可以用二分查找解决此类问题
取中间值,并设置两端的index,中间值大于左边的index,那么就将左边的index设置为中间值,向递增尾端移动,反之设置右边的index,向递减前端移动,最终两个index相差为1的时候,就找到了最小值,时间复杂度为O(logn)
注意问题:
1 当数组旋转0时,最左边元素小于最右边元素,这也就是indexMid最开始值为index1
2.当左端值和中间值和右端值相等时。无法判断数字是位于前面范围还是后面范围,因此退化为O(n)复杂度算法

具体实现

class Solution {
public:
mberInRotateArray(vector<int> rotateArray) {
        int index1 = 0;
        int index2 = rotateArray.size()-1;
        int indexMid = index1;
        while(rotateArray[index1] >= rotateArray[index2]){
            indexMid = (index1+index2)/2;
            if(rotateArray[index1]== rotateArray[indexMid] && 
              rotateArray[index2]== rotateArray[indexMid] )
                return Min(rotateArray, index1, index2);
            if(index2-index1 == 1){
                indexMid = index2;
                break;
            }
            if(rotateArray[indexMid] >= rotateArray[index1])
                index1 = indexMid;
            else
                index2 = indexMid;
        }
        return rotateArray[indexMid];
        
    }
    int Min (vector<int> rotateArray,int l,int r){
        for( int i = l; i < r ; i++){
            if(rotateArray[i] > rotateArray[i+1])
                return rotateArray[i+1];
        }
    }
};
发布了38 篇原创文章 · 获赞 6 · 访问量 8556

猜你喜欢

转载自blog.csdn.net/qq_36400206/article/details/104283952