题目要求:
思路:
第一眼看到这个题,想到的思路和约瑟夫环类似,就是一个数组的整数取余问题。但是在实际的测试运行中发现,自己有几个方面还是疏忽了。如果没有要求空间复杂度为O(1)的话,这个和约瑟夫环的解题思路几乎没什么区别。但就是这个要求,让自己犯了几个错误,做题的时候一定要学会变通。
设数组的长度为length,向右移动k(默认k<length)个位置
思路一
从第一个元素开始,向右移动k个位置,那么第一个元素的最终位置就是(0+k)%length;
同理第(0+k)%length个元素,向右移动k个位置,那么第(0+k)%length个元素的最终位置就是((0+k)%length+k)%length
......
这个解题思路对于示例一的输入是完全可以解出的,同理,对于length为奇数的数组是完全可以解出的。
思路一对于示例二的输入时,就显得无能为力了,因为它会陷入到一个循环中,就是这么一个循环困扰了我很久。
思路二
跳出这个循环很简单,一个方法是从第一个元素循环到第k个元素,这样就可以保证所有的元素都已经到最终位置上了,在其再进行优化的话就是添加一个计数swapCount,当swapCount等于length时跳出循环,这样可以避免重复遍历。
代码
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int swapCount = 1,length = nums.size();
int lastValue,nextValue;
k %= length;
for(int i=0;i<k;i++){
if(swapCount>length) break;
int index = i;
lastValue = nums[i];
while((index+k)%length != i)
{
nextValue = nums[(index+k)%length];
nums[(index+k)%length] = lastValue;
index = (index+k)%length;
swapCount++;
lastValue = nextValue;
}
nums[i] = lastValue;
swapCount++;
}
}
};