Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 9feec67

Browse files
author
Khanh Do
committed
Finish 0189
1 parent 014576b commit 9feec67

File tree

1 file changed

+93
-21
lines changed

1 file changed

+93
-21
lines changed

0189_rotate_array.py

Lines changed: 93 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
#!/usr/bin/env python
22

33
def rotate1(nums, k):
4-
"""Rotate an array to the right by k steps, where k is non-negative."""
4+
"""Rotate an array to the right by k steps, where k is non-negative.
5+
6+
Time: O(n) -- set n elements in new array
7+
Space: O(n) -- create a new array to store the rotated elements
8+
"""
9+
n = len(nums)
510

611
if k == 0:
712
return nums
13+
if n < 2:
14+
return nums
15+
16+
k = k % n # In case k > len(nums), prevent redundant rotations
817

9-
n = len(nums)
1018
new_nums = [0] * n
1119

1220
for i in range(n):
@@ -16,33 +24,97 @@ def rotate1(nums, k):
1624
return new_nums
1725

1826

19-
# def rotate2(nums, k):
20-
# """Rotate an array to the right by k steps, where k is non-negative."""
21-
# pass
27+
def rotate2(nums, k):
28+
"""Rotate an array to the right by k steps, where k is non-negative.
2229
30+
Time: O(kn) -- rotate n elements k times
31+
Space: O(1) -- rotate elements in place using a holder variable
32+
"""
33+
n = len(nums)
2334

24-
# def rotate2(nums, k):
25-
# """Rotate an array to the right by k steps, where k is non-negative."""
26-
# pass
35+
if k == 0:
36+
return nums
37+
if n < 2:
38+
return nums
2739

40+
k = k % n # In case k > len(nums), prevent redundant rotations
2841

29-
def main():
30-
# Example 1
31-
nums = [1, 2, 3, 4, 5, 6, 7]
32-
k = 3
42+
for _ in range(k):
43+
last = nums[n-1] # The extra O(1) space
44+
for i in range(n):
45+
# Since we're rotating elements to the right, we should traverse the
46+
# index from right-to-left to avoid overwriting previously traversed
47+
# elements
48+
j = n - 1 - i
49+
if j != 0:
50+
nums[j] = nums[j-1]
51+
else:
52+
nums[j] = last
3353

34-
assert rotate1(nums, k) == [5, 6, 7, 1, 2, 3, 4]
35-
# assert rotate2(nums, k) == [5, 6, 7, 1, 2, 3, 4]
36-
# assert rotate3(nums, k) == [5, 6, 7, 1, 2, 3, 4]
54+
return nums
3755

3856

39-
# Example 2
40-
nums = [-1, -100, 3, 99]
41-
k = 2
57+
def rotate3(nums, k):
58+
"""Rotate an array to the right by k steps, where k is non-negative.
4259
43-
assert rotate1(nums, k) == [3, 99, -1, -100]
44-
# assert rotate2(nums, k) == [3, 99, -1, -100]
45-
# assert rotate3(nums, k) == [3, 99, -1, -100]
60+
Time: O(k(n-k)) => O(kn - k^2) -- rotate (n-k) elements k times
61+
Space: O(1) -- rotate elements in place using a holder variable
62+
"""
63+
n = len(nums)
64+
65+
if k == 0:
66+
return nums
67+
if n < 2:
68+
return nums
69+
70+
k = k % n # In case k > len(nums), prevent redundant rotations
71+
72+
for i in range(k):
73+
saved = nums[n - k + i] # The extra O(1) space
74+
for j in range(n - k + i, i, -1):
75+
# Since we're rotating elements to the right, we should traverse the
76+
# index from right-to-left to avoid overwriting previously traversed
77+
# elements
78+
nums[j] = nums[j-1]
79+
nums[i] = saved
80+
81+
return nums
82+
83+
84+
def main():
85+
example_cases = [
86+
([1, 2, 3, 4, 5, 6, 7], 3, [5, 6, 7, 1, 2, 3, 4]), # Example 1
87+
([-1, -100, 3, 99], 2, [3, 99, -1, -100]), # Example 2
88+
]
89+
90+
for nums, k, ans in example_cases:
91+
assert rotate1(nums, k) == ans
92+
assert rotate2(list(nums), k) == ans
93+
assert rotate3(list(nums), k) == ans
94+
95+
96+
# Short-circuit cases
97+
short_circuit_cases = [
98+
([1, 2, 3], 0), # k = 0
99+
([], 3), # len(nums) = 0
100+
([1], 2), # len(nums) = 1
101+
]
102+
103+
for nums, k in short_circuit_cases:
104+
assert rotate1(nums, k) == nums
105+
assert rotate2(nums, k) == nums
106+
assert rotate3(nums, k) == nums
107+
108+
109+
# Interesting cases
110+
interesting_cases = [
111+
([1, 2, 3, 4], 10, [3, 4, 1, 2]) # k > len(nums)
112+
]
113+
114+
for nums, k, ans in interesting_cases:
115+
assert rotate1(nums, k) == ans
116+
assert rotate2(list(nums), k) == ans
117+
assert rotate3(list(nums), k) == ans
46118

47119

48120
if __name__ == '__main__':

0 commit comments

Comments
 (0)