[LintCode笔记了解一下]39.恢复旋转排序数组

思路:

1.需要O(n)的事件复杂度,所以多次循环不考虑

2.四步翻转法

  -第一步,找到数组里最小的那个数字,因为是旋转排序数组,所以只要找到某个位置arr[i]>arr[i+1]的话,就找到了那个位置,arr[i+1]就是整个数组里最小的数字

  -第二步,找到最小数字的位置后将index到i的前面的部分的数字翻转,比如[4,5,6,7,1,2,3]为例,翻转[4,5,6,7],则得到[7,6,5,4].

  -第三步,翻转剩下的部分[1,2,3],则变成[3,2,1]

  -第四步,全部翻转,则[7,6,5,4,3,2,1]变成[1,2,3,4,5,6,7]

    void recoverRotatedSortedArray(vector<int> &nums) {  
        // write your code here  
        int pos = 1, len = nums.size();  
        for(;(pos < len) && (nums[pos] >= nums[pos-1]); ++pos);//注意'='号  
        if(pos == len)// iterate一周后发现其实已经是顺序排序 
            return;  
        rotateArray(nums, 0, pos);  
        rotateArray(nums, pos, len);  
        rotateArray(nums, 0, len);  
    }  
    void rotateArray(vector<int> &nums, int begin, int end){  
        for(int i = begin, j = end - 1; i < j; ++i, --j)  
            swap(nums[i], nums[j]);  
    }  
原文地址:https://www.cnblogs.com/otakuhan/p/8598880.html