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

193 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

2022-07-10 09:04:10 +08:00
# Leetcode Rotate-Array
#### 2022-07-10 08:54
> ##### Algorithms:
2022-09-03 15:41:36 +08:00
>
2022-07-10 10:22:17 +08:00
> #algorithm #array_in_place_operation #reverse_array
2022-09-03 15:41:36 +08:00
>
2022-07-10 09:04:10 +08:00
> ##### Data structures:
2022-09-03 15:41:36 +08:00
>
> #DS #array
>
2022-07-10 09:04:10 +08:00
> ##### Difficulty:
2022-09-03 15:41:36 +08:00
>
2022-09-06 20:22:48 +08:00
> #coding_problem #difficulty_medium
2022-09-03 15:41:36 +08:00
>
2022-07-10 09:04:10 +08:00
> ##### Additional tags:
2022-09-03 15:41:36 +08:00
>
> #leetcode #CS_list_need_practicing #CS_list_need_understanding
>
2022-07-10 09:04:10 +08:00
> ##### Revisions:
2022-09-03 15:41:36 +08:00
>
2022-07-10 09:04:10 +08:00
> N/A
##### Related topics:
2022-09-03 15:41:36 +08:00
2022-07-10 09:04:10 +08:00
##### Links:
2022-09-03 15:41:36 +08:00
2022-07-10 09:04:10 +08:00
- [Link to problem](https://leetcode.com/problems/rotate-array/)
2022-09-03 15:41:36 +08:00
---
2022-07-10 09:04:10 +08:00
### 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]
2022-09-03 15:41:36 +08:00
**Explanation:**
2022-07-10 09:04:10 +08:00
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
#### Constraints
2022-09-03 15:41:36 +08:00
- `1 <= nums.length <= 105`
- `-231 <= nums[i] <= 231 - 1`
- `0 <= k <= 105`
2022-07-10 09:04:10 +08:00
### Thoughts
#### Method 1: Array In-place operation
2022-07-10 10:22:17 +08:00
This one is hard.
==#TODO: Revisit this one some other day==
- Reversing a subarray doesn't change the continuity, the neighbors inside the subarray is same.
- Reversing a subarray changes the edge's neighbors
Suppose a array looks like:
2022-09-03 15:41:36 +08:00
2022-07-10 10:22:17 +08:00
```
[1, 2,| 3, 4, 5]
```
2022-09-03 15:41:36 +08:00
If reverse all two subarrays, the neighbors isn't changed
2022-07-10 10:22:17 +08:00
only the orders are changed
```
[1, 2,| 3, 4, 5]: 5-1-2, 1-2-3, 2-3-4, 4-5-1
[2, 1,| 5, 4, 3]: 3-2-1, 2-1-5, 5-1-4, 4-3-2
```
When reversed back, the order is changed back to original, but the two sub-arrays are swapped
```
[3, 4, 5,| 1, 2]
```
By doing this, the order in inner-array isn't changed, but the order of all is changed.
2022-07-10 09:04:10 +08:00
#### Method 2: Copy
2022-07-10 09:57:15 +08:00
Watch out for integer overflow.
2022-07-10 10:22:17 +08:00
#### Method 3: CPP's STL sway subarrays
2022-07-10 09:57:15 +08:00
2022-07-10 10:22:17 +08:00
Remember to sanitize k, when k > size
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
2022-07-10 10:22:17 +08:00
Method 1:
```cpp
2022-07-10 10:26:30 +08:00
class Solution {
void swap(vector<int> &nums, int l, int r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
void reverse(vector<int> &nums, int l, int r) {
while (l < r) {
swap(nums, l, r);
l++;
r--;
}
}
public:
void rotate(vector<int> &nums, int k) {
const int size = nums.size();
k = k % size;
// Reversion
reverse(nums, 0, size - k - 1);
reverse(nums, size - k, size - 1);
reverse(nums, 0, size - 1);
}
};
2022-07-10 10:22:17 +08:00
```
2022-07-10 09:57:15 +08:00
Method 2:
2022-09-03 15:41:36 +08:00
2022-07-10 09:57:15 +08:00
```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];
}
}
};
2022-07-10 10:22:17 +08:00
```
Method 3:
2022-09-03 15:41:36 +08:00
2022-07-10 10:22:17 +08:00
```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;
}
// STL
k = k % size;
k = size - k;
while (k < 0) {
k += size;
}
nums.insert(nums.end(), nums.begin(), nums.begin() + k);
nums.erase(nums.begin(), nums.begin() + k);
}
};
2022-09-03 15:41:36 +08:00
```