旋转数组:给定一个数组,将数组中的元素向右移动 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]
思路:题目的确不难,难点在于要求空间复杂度为O(1)的原地算法,也就是说不能新建一个数组,这样就得完全通过交换数组元素来解决这个问题。
看到网上大神的一个思路:
大概是:如果旋转【1,2,3,4,5,6】2的话 结果是【5,6,1,2,3,4】 很容易发现就是把最后k个元素移到前面来,其他不变。
那么我们先把数组倒置:变成【6,5,4,3,2,1】与【5,6,1,2,3,4】的区别就是前后元素的顺序,如果把前k个元素倒置,后length-k个元素倒置就是 【5,6,1,2,3,4】,很巧妙的一个方法。
所以一共分三个步骤:
1、数组倒置
2、前k个元素倒置
3、后length-k个元素倒置
注意:k有可能比数组长度还大,但是注意每旋转数组长度length次就相当于未做任何改动,所以 k%=length
代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k%=nums.size();
swap(nums,0,nums.size()-1);
swap(nums,0,k-1);
swap(nums,k,nums.size()-1);
};
void swap(vector<int>&nums,int s,int e)
{
int temp;
for(int i=s;i<e;i++)
{
temp=nums[e];
nums[e]=nums[i];
nums[i]=temp;
e--;
}
};
};