Recover Rotated Sorted Array

Given a rotated sorted array, recover it to sorted array in-place.

Have you met this question in a real interview? 
Yes
Example

[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]

Challenge

In-place, O(1) extra space and O(n) time.

Clarification

What is rotated array?

  • For example, the orginal array is [1,2,3,4], The rotated array of it can be [1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
此題目的意思,是說給定一個已經旋轉過的數組,然後恢復爲未旋轉之前的數組;爲了恢復,首先得知道數組旋轉了多少次,所以先統計數組旋轉的次數K,那麼K之前是遞增的,K之後也是遞增的,如何恢復呢?這裏巧妙的用到了反轉,可以先將K之前的部分反轉一次,然後K之後的部分反轉一次,最後再全部反轉一次,這樣會發現,得到的數組,剛好是未旋轉之前的數組。時間複雜度剛好爲O(2 * N),空間複雜度爲O(1).。
class Solution {
public:
    //找到最小值的下標,然後恢復原始數組順序
    //恢復的時候,用反轉,先整個反轉一次,然後,每段分開反轉一次
    void Swap(int &a, int &b)
    {
        a = a + b;
        b = a - b;
        a = a - b;
    }
    
    void recoverRotatedSortedArray(vector<int> &nums) {
        // write your code here
        int len = nums.size();
        if(len < 2)
            return;
        int k = 0;
        for(int i = 1; i < len; ++i)
        {
            if(nums[i] < nums[i - 1])
            {
                k = i;
                break;
            }
        }
        
        if(k == 0)
            return;
        
        //第一次反轉前面部分
        int low = 0, high = k - 1;
        while(low < high)
        {
            Swap(nums[low], nums[high]);
            ++low;
            --high;
        }
        
        //第二次反轉後面部分
        low = k; high = len - 1;
        while(low < high)
        {
            Swap(nums[low], nums[high]);
            ++low; --high;
        }
        
        //反轉整個數組
        low = 0; high = len - 1;
        while(low < high)
        {
            Swap(nums[low], nums[high]);
            ++low; --high;
        }
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章