牛客题霸 [ 旋转数组] C++题解/答案

牛客题霸 [ 旋转数组] C++题解/答案

题目描述

一个数组A中存有N(N&gt0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

题解:

很多人都用额外的变量来实现移动,我这提供一个比较巧妙的思路
[1,2,3,4,5,6]—>[5,6,1,2,3,4]
我们可以先将整个数组翻转
就成:[6,5,4,3,2,1]
因为是移动m,所以我们前m个数字再翻转
就成:[5,6,4,3,2,1]
我们再将第m+1位到最后,所有数翻转
就成:[5,6,1,2,3,4]
这样就实现了移动,还没有用到其他任何变量

代码:

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;
        //return a;
    }
};
posted @ 2020-11-06 13:58  回归梦想  阅读(83)  评论(0编辑  收藏  举报