-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path189_Rotate_Array.cpp
68 lines (62 loc) · 1.34 KB
/
189_Rotate_Array.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<vector>
#include<deque>
#include<iostream>
using namespace std;
class Solution {
public:
void rotate(vector<int>& nums, int k) {
// Leetcode acquire you to provide over three solutions and try not use extra space.
// Solution 1: Brute-force, Space: O(n), T: O(n+k), where n == nums.size()
// 24 ms, 71.6%
deque<int> dq;
int n = nums.size();
for (int i = n - 1; i > -1; --i)
{
dq.push_front(nums.back());
nums.pop_back();
}
for (int i = 0; i < k; ++i) {
dq.push_front(dq.back());
dq.pop_back();
}
for (int i = 0; i < n; ++i)
{
nums.push_back(dq.front());
dq.pop_front();
}
// Solution 2: reverse 3 times
// 1. Reverse whole array
// 2. Reverse nums[0..k-1]
// 3. Reverse nums[k..end]
// S: O(1) T: O(n)
// 20ms, 92.7%
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k-1);
reverse(nums, k, nums.size() - 1);
}
void reverse(vector<int>& nums, int l, int r)
{
int tmp;
while (l < r)
{
tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
++l;
--r;
}
}
};
void main()
{
Solution solu;
vector<int> case1{ 1,2 };
vector<int> EA1{ 1,2 };
solu.rotate(case1, 0);
cout << "case1:" << (case1 == EA1) << endl;
vector<int> case2{ -1,-100,3,99 };
vector<int> EA2{ 3,99,-1,-100 };
solu.rotate(case2, 2);
cout << "case2:" << (case2 == EA2) << endl;
}