Skip to content

Commit f82d4e1

Browse files
committed
Added rotate_array.py
1 parent 12b1023 commit f82d4e1

1 file changed

Lines changed: 130 additions & 0 deletions

File tree

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
"""
2+
Given an integer array nums and a non-negative integer k, rotate
3+
nums to the right by k places.
4+
5+
LeetCode Link: https://leetcode.com/problems/rotate-array/
6+
7+
4 Different Implementations
8+
"""
9+
10+
from collections import deque
11+
12+
13+
# Time: O(n * k) Space: O(1)
14+
def rotate_array_nk_time(nums: list[int], k: int) -> list[int]:
15+
"""
16+
Takes the last k integers, and one by one, inserts them at the start of the array.
17+
18+
>>> rotate_array_nk_time([-1, 7, 25, 6], 3)
19+
[7, 25, 6, -1]
20+
>>> rotate_array_nk_time([4, 14, 2, -6, -9, 1, -37], 2)
21+
[1, -37, 4, 14, 2, -6, -9]
22+
>>> rotate_array_nk_time([19, -2, 5, 5, 11], 5)
23+
[19, -2, 5, 5, 11]
24+
>>> rotate_array_nk_time([1, 2, 4, 1, 2, 4], 3)
25+
[1, 2, 4, 1, 2, 4]
26+
>>> rotate_array_nk_time([8, -7, 22, -6], 9)
27+
[-6, 8, -7, 22]
28+
"""
29+
30+
length = len(nums)
31+
k = k % length
32+
curr = length - k
33+
for i in range(k):
34+
dummy = nums[curr]
35+
for j in range(curr - 1, i - 1, -1):
36+
nums[j + 1] = nums[j]
37+
38+
nums[i] = dummy
39+
curr += 1
40+
41+
return nums
42+
43+
44+
# Time: O(n) Space: O(n)
45+
def rotate_array_n_space(nums: list[int], k: int) -> list[int]:
46+
"""
47+
Creates new array consisting of last k integers in nums followed by remaining
48+
integers in nums.
49+
50+
>>> rotate_array_n_space([-1, 7, 25, 6], 3)
51+
[7, 25, 6, -1]
52+
>>> rotate_array_n_space([4, 14, 2, -6, -9, 1, -37], 2)
53+
[1, -37, 4, 14, 2, -6, -9]
54+
>>> rotate_array_n_space([19, -2, 5, 5, 11], 5)
55+
[19, -2, 5, 5, 11]
56+
>>> rotate_array_n_space([1, 2, 4, 1, 2, 4], 3)
57+
[1, 2, 4, 1, 2, 4]
58+
>>> rotate_array_n_space([8, -7, 22, -6], 9)
59+
[-6, 8, -7, 22]
60+
"""
61+
62+
return nums[-k:] + nums[:k]
63+
64+
65+
# Time: O(n) Space: O(k)
66+
def rotate_array_k_space(nums: list[int], k: int) -> list[int]:
67+
"""
68+
Uses a deque buffer of size k to shift each integer in nums by k places.
69+
70+
>>> rotate_array_k_space([-1, 7, 25, 6], 3)
71+
[7, 25, 6, -1]
72+
>>> rotate_array_k_space([4, 14, 2, -6, -9, 1, -37], 2)
73+
[1, -37, 4, 14, 2, -6, -9]
74+
>>> rotate_array_k_space([19, -2, 5, 5, 11], 5)
75+
[19, -2, 5, 5, 11]
76+
>>> rotate_array_k_space([1, 2, 4, 1, 2, 4], 3)
77+
[1, 2, 4, 1, 2, 4]
78+
>>> rotate_array_k_space([8, -7, 22, -6], 9)
79+
[-6, 8, -7, 22]
80+
"""
81+
82+
length = len(nums)
83+
k = k % length
84+
buffer = deque(nums[length - k :])
85+
for i in range(length):
86+
buffer.append(nums[i])
87+
nums[i] = buffer.popleft()
88+
89+
return nums
90+
91+
92+
# Time: O(n) Space: O(1)
93+
def rotate_array_constant_space(nums: list[int], k: int) -> list[int]:
94+
"""
95+
Reverse whole array. Then reverse first k elements. Then reverse remaining elements.
96+
97+
>>> rotate_array_constant_space([-1, 7, 25, 6], 3)
98+
[7, 25, 6, -1]
99+
>>> rotate_array_constant_space([4, 14, 2, -6, -9, 1, -37], 2)
100+
[1, -37, 4, 14, 2, -6, -9]
101+
>>> rotate_array_constant_space([19, -2, 5, 5, 11], 5)
102+
[19, -2, 5, 5, 11]
103+
>>> rotate_array_constant_space([1, 2, 4, 1, 2, 4], 3)
104+
[1, 2, 4, 1, 2, 4]
105+
>>> rotate_array_constant_space([8, -7, 22, -6], 9)
106+
[-6, 8, -7, 22]
107+
"""
108+
109+
length = len(nums)
110+
k = k % length
111+
112+
def reverse(left: int, right: int) -> None:
113+
while left < right:
114+
temp = nums[left]
115+
nums[left] = nums[right]
116+
nums[right] = temp
117+
left += 1
118+
right -= 1
119+
120+
reverse(0, length - 1)
121+
reverse(0, k - 1)
122+
reverse(k, length - 1)
123+
124+
return nums
125+
126+
127+
if __name__ == "__main__":
128+
import doctest
129+
130+
doctest.testmod()

0 commit comments

Comments
 (0)