mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-02-28 11:58:39 +00:00
Added rotate_array.py
This commit is contained in:
parent
12b1023a9d
commit
f82d4e1036
130
data_structures/arrays/rotate_array.py
Normal file
130
data_structures/arrays/rotate_array.py
Normal file
@ -0,0 +1,130 @@
|
||||
"""
|
||||
Given an integer array nums and a non-negative integer k, rotate
|
||||
nums to the right by k places.
|
||||
|
||||
LeetCode Link: https://leetcode.com/problems/rotate-array/
|
||||
|
||||
4 Different Implementations
|
||||
"""
|
||||
|
||||
from collections import deque
|
||||
|
||||
|
||||
# Time: O(n * k) Space: O(1)
|
||||
def rotate_array_nk_time(nums: list[int], k: int) -> list[int]:
|
||||
"""
|
||||
Takes the last k integers, and one by one, inserts them at the start of the array.
|
||||
|
||||
>>> rotate_array_nk_time([-1, 7, 25, 6], 3)
|
||||
[7, 25, 6, -1]
|
||||
>>> rotate_array_nk_time([4, 14, 2, -6, -9, 1, -37], 2)
|
||||
[1, -37, 4, 14, 2, -6, -9]
|
||||
>>> rotate_array_nk_time([19, -2, 5, 5, 11], 5)
|
||||
[19, -2, 5, 5, 11]
|
||||
>>> rotate_array_nk_time([1, 2, 4, 1, 2, 4], 3)
|
||||
[1, 2, 4, 1, 2, 4]
|
||||
>>> rotate_array_nk_time([8, -7, 22, -6], 9)
|
||||
[-6, 8, -7, 22]
|
||||
"""
|
||||
|
||||
length = len(nums)
|
||||
k = k % length
|
||||
curr = length - k
|
||||
for i in range(k):
|
||||
dummy = nums[curr]
|
||||
for j in range(curr - 1, i - 1, -1):
|
||||
nums[j + 1] = nums[j]
|
||||
|
||||
nums[i] = dummy
|
||||
curr += 1
|
||||
|
||||
return nums
|
||||
|
||||
|
||||
# Time: O(n) Space: O(n)
|
||||
def rotate_array_n_space(nums: list[int], k: int) -> list[int]:
|
||||
"""
|
||||
Creates new array consisting of last k integers in nums followed by remaining
|
||||
integers in nums.
|
||||
|
||||
>>> rotate_array_n_space([-1, 7, 25, 6], 3)
|
||||
[7, 25, 6, -1]
|
||||
>>> rotate_array_n_space([4, 14, 2, -6, -9, 1, -37], 2)
|
||||
[1, -37, 4, 14, 2, -6, -9]
|
||||
>>> rotate_array_n_space([19, -2, 5, 5, 11], 5)
|
||||
[19, -2, 5, 5, 11]
|
||||
>>> rotate_array_n_space([1, 2, 4, 1, 2, 4], 3)
|
||||
[1, 2, 4, 1, 2, 4]
|
||||
>>> rotate_array_n_space([8, -7, 22, -6], 9)
|
||||
[-6, 8, -7, 22]
|
||||
"""
|
||||
|
||||
return nums[-k:] + nums[:k]
|
||||
|
||||
|
||||
# Time: O(n) Space: O(k)
|
||||
def rotate_array_k_space(nums: list[int], k: int) -> list[int]:
|
||||
"""
|
||||
Uses a deque buffer of size k to shift each integer in nums by k places.
|
||||
|
||||
>>> rotate_array_k_space([-1, 7, 25, 6], 3)
|
||||
[7, 25, 6, -1]
|
||||
>>> rotate_array_k_space([4, 14, 2, -6, -9, 1, -37], 2)
|
||||
[1, -37, 4, 14, 2, -6, -9]
|
||||
>>> rotate_array_k_space([19, -2, 5, 5, 11], 5)
|
||||
[19, -2, 5, 5, 11]
|
||||
>>> rotate_array_k_space([1, 2, 4, 1, 2, 4], 3)
|
||||
[1, 2, 4, 1, 2, 4]
|
||||
>>> rotate_array_k_space([8, -7, 22, -6], 9)
|
||||
[-6, 8, -7, 22]
|
||||
"""
|
||||
|
||||
length = len(nums)
|
||||
k = k % length
|
||||
buffer = deque(nums[length - k :])
|
||||
for i in range(length):
|
||||
buffer.append(nums[i])
|
||||
nums[i] = buffer.popleft()
|
||||
|
||||
return nums
|
||||
|
||||
|
||||
# Time: O(n) Space: O(1)
|
||||
def rotate_array_constant_space(nums: list[int], k: int) -> list[int]:
|
||||
"""
|
||||
Reverse whole array. Then reverse first k elements. Then reverse remaining elements.
|
||||
|
||||
>>> rotate_array_constant_space([-1, 7, 25, 6], 3)
|
||||
[7, 25, 6, -1]
|
||||
>>> rotate_array_constant_space([4, 14, 2, -6, -9, 1, -37], 2)
|
||||
[1, -37, 4, 14, 2, -6, -9]
|
||||
>>> rotate_array_constant_space([19, -2, 5, 5, 11], 5)
|
||||
[19, -2, 5, 5, 11]
|
||||
>>> rotate_array_constant_space([1, 2, 4, 1, 2, 4], 3)
|
||||
[1, 2, 4, 1, 2, 4]
|
||||
>>> rotate_array_constant_space([8, -7, 22, -6], 9)
|
||||
[-6, 8, -7, 22]
|
||||
"""
|
||||
|
||||
length = len(nums)
|
||||
k = k % length
|
||||
|
||||
def reverse(left: int, right: int) -> None:
|
||||
while left < right:
|
||||
temp = nums[left]
|
||||
nums[left] = nums[right]
|
||||
nums[right] = temp
|
||||
left += 1
|
||||
right -= 1
|
||||
|
||||
reverse(0, length - 1)
|
||||
reverse(0, k - 1)
|
||||
reverse(k, length - 1)
|
||||
|
||||
return nums
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
Loading…
x
Reference in New Issue
Block a user