notes/OJ notes/pages/Leetcode Rotate-Array.md

98 lines
1.7 KiB
Markdown
Raw Normal View History

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];
}
}
};
```