题目描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjrboVDw-1631589254724)(E:\Typora\leetcode算法题目\双指针算法\image-20210912000315663-16313762072071.png)]
题目解法
解法一循环换位
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k % n;
int count = gcd(k, n);//n和k的最大公约数
for (int start = 0; start < count; ++start) {
int current = start;
int prev = nums[start];
do {
int next = (current + k) % n;
swap(nums[next], prev);
current = next;
} while (start != current);
}
}
};
do{}while循环先执行里面再执行外部的while,用一个指针直接指向当前的数据,也就自然知到了下一个数据的位置。
public:
void rotate(vector<int>& nums, int k) {
int pre;
int temp;
int length=nums.size();
k=k%length;//使大数变成小数据
int count=0;
int next=1;//初始化为1是为了与start不相同
for(int start=0;count<length;start++){
pre=nums[start];
bool flag=true;//判断是否第一循环
while(start!=next){
if(flag){
next=start;//使下一个数据找到下一个点
next=(next+k)%length;
temp=nums[next];
nums[next]=pre;
pre=temp;
count++;
flag=!flag;
}else{
next=(next+k)%length;
temp=nums[next];
nums[next]=pre;
pre=temp;
count++;
}
}
}
}
};
解法二再建数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> newArr(n);
for (int i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解法三
class Solution {
public:
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start += 1;
end -= 1;
}
}
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};
思路如下:
- 首先对整个数组实行翻转,这样子原数组中需要翻转的子数组,就会跑到数组最前面。
- 这时候,从 kk 处分隔数组,左右两数组,各自进行翻转即可。