【两根指针——相向双指针】Lintcode 39. 恢复旋转排序数组

Lintcode 39. 恢复旋转排序数组

题目描述:给定一个旋转排序数组,在原地恢复其排序。(升序)
在这里插入图片描述
这道题理解的不是很透,之后需要再深入实现一下。

class Solution {
    
    
public:
    /**
     * @param nums: An integer array
     * @return: nothing
     */
    void recoverRotatedSortedArray(vector<int> &nums) {
    
    
        int offset = 0;
        for (int i = 1; i < nums.size(); ++i) {
    
    //寻找偏移量
            if (nums[i-1] > nums[i]) {
    
    
                offset = i;   
            }
        }
        if (0 == offset) {
    
    
            return;
        }
        offset = nums.size() - offset;
        
        int gcd = getGCD(offset, nums.size());
        for (int i = 0; i < gcd; ++i) {
    
    
            int next = (i + offset) % nums.size();
            //将每个数放到它们应该放的位置
            while (next != i) {
    
    
                int tmp = nums[i];
                nums[i] = nums[next];
                nums[next] = tmp;
                next = (next + offset) % nums.size();
            }
        }
    }
    
    //辗转相除法求最大公约数
    int getGCD(int a, int b) {
    
    
        if (0 == a % b) {
    
    
            return b;
        }
        return getGCD(b, a % b);
    }
};

猜你喜欢

转载自blog.csdn.net/phdongou/article/details/113838231
今日推荐