Given an array, rotate the array to the right by k steps, where k is non-negative.
Example 1:
Input:[1,2,3,4,5,6,7]
and k = 3 Output:[5,6,7,1,2,3,4]
Explanation: rotate 1 steps to the right:[7,1,2,3,4,5,6]
rotate 2 steps to the right:[6,7,1,2,3,4,5]
rotate 3 steps to the right:[5,6,7,1,2,3,4]
Example 2:
Input: [-1,-100,3,99]
and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:
- Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
- Could you do it in-place with O(1) extra space?
思路:
解法一:暴力无脑移动数组k次,要移动整个数组k次
解法二:
Step1:
1.将数组分为左右两个部分,左边长度为n-k,右边长度为k.n为数组长度
2.将左右数组分别进行reverse
3.将整个数组进行reverse;
理解基础:reverse 之后元素位置的相对变化
举例:位置为i的元素reverse之后的位置在start+end-i的地方,start end 分别为数组边界的地方
所以为什么要分右边数组为k呢?
当分为k后,左边数组的end =n-k ,左边数组任意元素旋转之后的位置为n-k+1-i,在整个数组reverse时变为i+k,相当于左边元素都通过移动i+k到了自己的位置
code:
class Solution {
public:
void exchange(vector<int>& nums,int start,int end){
int lo=start;int hi=end;
int temp;
while(lo<=hi)
{
temp=nums[lo];
nums[lo]=nums[hi];
nums[hi]=temp;
lo++;hi--;
}
}
void rotate(vector<int>& nums, int k) {
vector<int>map[10];
int n=nums.size();
k=k%n;
if(n<=1)return;
exchange(nums,0,n-k-1);
exchange(nums,n-k,n-1);
exchange(nums,0,n-1);
}
};