题意:将数组旋转k次,如将数组[1,2,3,4,5]旋转1次得到[2,3,4,5,1],将数组[1,2,3,4,5]旋转2次得到[3,4,5,1,2].....
本质是将数组分成两部分a1,a2,...ak以及ak+1....an两部分,然后将两部分进行交换。
我的解法是将数组分成两部分a1,a2,.....an-k-1以及an-k,.....an,然后将两部分分别反转得到数组ank-1,.....,a2,a1,an......an-k
然后将这个数组反转得到an-k,.....an,a1,a2,....ank-1。
这个算法复杂度为O(n),空间复杂度O(1).
1 class Solution { 2 public: 3 void rotate(vector<int>& nums, int k) { 4 if(nums.size() == 0) return; 5 k %= nums.size(); 6 if(0 == k) return; 7 reverse(nums.begin(), nums.end() - k); 8 reverse(nums.end() - k, nums.end()); 9 reverse(nums.begin(), nums.end()); 10 } 11 };