解法一、栈方法 O(n)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
//栈的方法
int n = nums.size();
k = k % n;
int rightBound = n - k - 1;
stack<int> S;
for(int i = rightBound; i >= 0 ; i--) {
S.push(nums[i]);
}
for(int j = nums.size() - 1; j > rightBound; j--) {
S.push(nums[j]);
}
nums.clear();
while(!S.empty()) {
nums.push_back(S.top());
S.pop();
}
}
};
解法二、
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int size = nums.size();
int* newVector = new int[size];
k = k % size;
int bound = size - k;
int i = 0;
while(i < k) {
newVector[i++] = nums[bound++];
}
while(i >= k && i < size) {
newVector[i] = nums[i - k];
i++;
}
nums.clear();
for(int i = 0; i < size; i++) {
nums.push_back(newVector[i]);
}
}
};
解法三、三次翻转
12345678 k = 3
反转一次(全体翻转): 87654321
反转两次(翻转0: k - 1): 67854321
反转三次(反转k: n - 1): 67812345
class Solution {
public:
void reverse(vector<int>& arr, int start, int end) {
int temp;
while(start < end) {
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
void rotate(vector<int>& nums, int k) {
//两次翻转
int n = nums.size();
k = k % n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
};