189. 旋轉數組 - 力扣(LeetCode)

題目描述

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:
輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]

示例 2:
輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋:
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]
說明:
儘可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
要求使用空間複雜度爲 O(1) 的 原地 算法。

題解1

首先想到的是之前看到三次reverse的解法,主要是找到旋轉點,通過三次reverse來達到旋轉數組的目的。
時間複雜度爲:O(n)O(n)

代碼1

/*
找到旋轉點
三次reverse
*/
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int len = nums.size();
        k = k % len;//使k取值在0-len-1
        int rot = len - k;//旋轉點
        reverse(nums.begin(), nums.begin() + rot);
        reverse(nums.begin() + rot, nums.end());
        reverse(nums.begin(), nums.end());
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章