难度:中等。
本来是很简单的题,但要求空间复杂度为O(1)。
因此就需要找规律了,第一次找出规律但提交后错了。
之后发现需要求出数组大小和k的最大公因数d,表明数组中有d组元素互相交换。
找最大公因数的方法有三种:
- 暴力法
- 相减法:思路见代码
- 辗转相除法
step1. a存放较大的数,b存放较小的数
step2. k = a % b
step3. 若k == 0, 则b是最大公因数
step4. 否则:a = b, b = temp
step5. 回到step2
正确解法:
class Solution {
public:
int max_divisor(int a, int b){
while(a != b){
if(a > b)a -= b;
else b -= a;
}
return a;
}
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k = k % len;
if(k != 0 && len > 1){
int divisor = max_divisor(len, k);
for(int j = 0; j < divisor; j++){
int loc_index = (k + j) % len;
int last_value = nums[j];
for(int i = 0; i < len / divisor; i++){
int now_value = nums[loc_index];
nums[loc_index] = last_value;
last_value = now_value;
loc_index = (k + loc_index) % len;
}
}
}
}
};