算法--模拟法

 

 

方法:三次翻转(推荐使用)

思路:

循环右移相当于从第mmm个位置开始,左右两部分视作整体翻转。即abcdefg右移3位efgabcd可以看成AB翻转成BA(这里小写字母看成数组元素,大写字母看成整体)。既然是翻转我们就可以用到reverse函数。

具体做法:

  • step 1:因为mmm可能大于nnn,因此需要对nnn取余,因为每次长度为nnn的旋转数组相当于没有变化。
  • step 2:第一次将整个数组翻转,得到数组的逆序,它已经满足了右移的整体出现在了左边。
  • step 3:第二次就将左边的mmm个元素单独翻转,因为它虽然移到了左边,但是逆序了。
  • step 4:第三次就将右边的n−mn-mnm个元素单独翻转,因此这部分也逆序了。

 

class Solution {
public:
    /**
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型vector 给定数组
     * @return int整型vector
     */
    vector<int> solve(int n, int m, vector<int>& a) {
        // write code here
        m = m% n;
        reverse(a.begin(),a.end());
        reverse(a.begin(),a.begin()+m);
        reverse(a.begin()+m,a.end());
        return a; 
    }
};

  

 

posted @ 2022-08-18 22:38  jerry-autumn  阅读(285)  评论(0)    收藏  举报