2022-07-10 09:04:10 +08:00
|
|
|
# Leetcode Rotate-Array
|
|
|
|
|
|
|
|
#### 2022-07-10 08:54
|
|
|
|
|
|
|
|
> ##### Algorithms:
|
|
|
|
> #algorithm #array_in_place_operation
|
|
|
|
> ##### Data structures:
|
|
|
|
> #DS #array
|
|
|
|
> ##### Difficulty:
|
|
|
|
> #coding_problem #difficulty-medium
|
|
|
|
> ##### Additional tags:
|
|
|
|
> #leetcode
|
|
|
|
> ##### Revisions:
|
|
|
|
> N/A
|
|
|
|
|
|
|
|
##### Related topics:
|
|
|
|
```expander
|
|
|
|
tag:#array_in_place_operation
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### Links:
|
|
|
|
- [Link to problem](https://leetcode.com/problems/rotate-array/)
|
|
|
|
___
|
|
|
|
### Problem
|
|
|
|
|
|
|
|
Given an array, rotate the array to the right by `k` steps, where `k` is non-negative.
|
|
|
|
|
|
|
|
#### Examples
|
|
|
|
|
|
|
|
**Example 1:**
|
|
|
|
|
|
|
|
**Input:** nums = [1,2,3,4,5,6,7], k = 3
|
|
|
|
**Output:** [5,6,7,1,2,3,4]
|
|
|
|
**Explanation:**
|
|
|
|
rotate 1 steps to the right: [7,1,2,3,4,5,6]
|
|
|
|
rotate 2 steps to the right: [6,7,1,2,3,4,5]
|
|
|
|
rotate 3 steps to the right: [5,6,7,1,2,3,4]
|
|
|
|
|
|
|
|
**Example 2:**
|
|
|
|
|
|
|
|
**Input:** nums = [-1,-100,3,99], k = 2
|
|
|
|
**Output:** [3,99,-1,-100]
|
|
|
|
**Explanation:**
|
|
|
|
rotate 1 steps to the right: [99,-1,-100,3]
|
|
|
|
rotate 2 steps to the right: [3,99,-1,-100]
|
|
|
|
|
|
|
|
#### Constraints
|
|
|
|
|
|
|
|
- `1 <= nums.length <= 105`
|
|
|
|
- `-231 <= nums[i] <= 231 - 1`
|
|
|
|
- `0 <= k <= 105`
|
|
|
|
|
|
|
|
### Thoughts
|
|
|
|
|
|
|
|
#### Method 1: Array In-place operation
|
|
|
|
|
|
|
|
#### Method 2: Copy
|
|
|
|
|
2022-07-10 09:57:15 +08:00
|
|
|
Watch out for integer overflow.
|
|
|
|
|
2022-07-10 09:04:10 +08:00
|
|
|
#### Method 3: CPP's STL
|
|
|
|
|
2022-07-10 09:57:15 +08:00
|
|
|
|
|
|
|
|
2022-07-10 09:04:10 +08:00
|
|
|
### Solution
|
2022-07-10 09:57:15 +08:00
|
|
|
|
|
|
|
Method 2:
|
|
|
|
```cpp
|
|
|
|
class Solution {
|
|
|
|
void swap(vector<int> &nums, int l, int r) {
|
|
|
|
int temp = nums[l];
|
|
|
|
nums[l] = nums[r];
|
|
|
|
nums[r] = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
void rotate(vector<int> &nums, int k) {
|
|
|
|
int size = nums.size();
|
|
|
|
if (size <= 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Copy
|
|
|
|
k = size - k;
|
|
|
|
while (k < 0) {
|
|
|
|
k += size;
|
|
|
|
}
|
|
|
|
vector<int> ans(nums.size());
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
ans[i] = nums[(i + k) % size];
|
|
|
|
}
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
nums[i] = ans[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|