1
1
#!/usr/bin/env python
2
2
3
3
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 )
5
10
6
11
if k == 0 :
7
12
return nums
13
+ if n < 2 :
14
+ return nums
15
+
16
+ k = k % n # In case k > len(nums), prevent redundant rotations
8
17
9
- n = len (nums )
10
18
new_nums = [0 ] * n
11
19
12
20
for i in range (n ):
@@ -16,33 +24,97 @@ def rotate1(nums, k):
16
24
return new_nums
17
25
18
26
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.
22
29
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 )
23
34
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
27
39
40
+ k = k % n # In case k > len(nums), prevent redundant rotations
28
41
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
33
53
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
37
55
38
56
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.
42
59
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
46
118
47
119
48
120
if __name__ == '__main__' :
0 commit comments