题意概述

  • 给定一组长度为n数组
  • 要求将其整体向右循环m个位置

方法一:模拟

思路与具体做法

  • 不断从从数组尾取出元素, 插入数组头,然后删除数组尾的多余元素
  • 直到循环M次为止
class Solution {
public:
    vector<int> solve(int n, int m, vector<int>& a) {
       while(m--){
           a.insert(a.begin(),a.back());//从数组尾取出元素, 插入数组头
           a.pop_back();//删除数组尾的多余元素
       }
        return a;
    }
};

时间复杂度和空间复杂度分析

  • 时间复杂度:O(m)O(m)O(m),模拟m次旋转操作
  • 空间复杂度:O(1)O(1)O(1),没有使用额外的空间

方法二:两次遍历

思路与具体做法

  • 因为数组可看成由两部分保持原序的数组从中断开再改变位置拼接而成
  • 所以我们可以遍历两次,每次分别取对应数组值即可
  • 注意数组向右移动位置可能超过数组长度,所以要将向右移动位置对数组长度取余 alt
class Solution {
public:
    vector<int> solve(int n, int m, vector<int>& a) {
        vector<int> ans;
        for(int i=n-m%n;i<n;i++){//先取后半部分 
            ans.push_back(a[i]);
        }
        for(int i=0;i<n-m%n;i++){//再取前半部分 
            ans.push_back(a[i]);
        }
        return ans;
    }
};

时间复杂度和空间复杂度分析

  • 时间复杂度:O(n)O(n)O(n),遍历了两次数组,但总长度为数组长度n
  • 空间复杂度:O(1)O(1)O(1),没有使用额外的空间