题目描述
给定一个数组,将数组中的元素向右移动 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]
示例 2:
输入: [-1,-100,3,99]和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步:[99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
#include <vector>
//要先实现一个数组反转可以通过三次反转实现
//references:https://blog.csdn.net/qq_28584889/article/details/83655019?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
class Solution{
public:
//数组反转
void reverseArray(vector<int>& array, int begin, int end){
int temp,tmp_end = end;
for(int i = begin; i <= (begin+end)/2; i++){
temp = array[i];
array[i] = array[tmp_end];
array[tmp_end] = temp;
tmp_end--;
}
}
void rotate(vector<int>& nums, int k){
int len = nums.size();
k %= len;
if(k == 0)
return;
reverseArray(nums,0,len-k-1);
reverseArray(nums,len-k,len-1);
reverseArray(nums,0,len-1);
//C++自带的反转函数
// reverse(nums.begin(),nums.end()-k);
// reverse(nums.end()-k,nums.end());
// reverse(nums.begin(),nums.end());
}
};
//Solution2:
void reverseArray(int nums[],int start, int end){
int temp;
while(start < end){
temp = nums[start];
nums[start++] = nums[end];
nums[end--] = temp;
}
}
void rotate(int nums[], int n, int k){
k%=n;
if(k<=0) return;
reverseArray(nums,n-k,n-1);
reverseArray(nums,0,n-k-1);
reverseArray(nums,0,n-1);
}
怕什么真理无穷,进一寸有一寸的欢喜。---胡适
浙公网安备 33010602011771号