diff --git a/work/1/Medium/Array/189.rotate-array.py b/work/1/Medium/Array/189.rotate-array.py new file mode 100644 index 0000000..775b2ea --- /dev/null +++ b/work/1/Medium/Array/189.rotate-array.py @@ -0,0 +1,64 @@ +""" +189. Rotate Array +Difficulty: Medium +https://leetcode.com/problems/rotate-array/ + +────────────────────────────────────────────────── + +Given an integer array nums, rotate the array to the right by k +steps, where k is non-negative. + + + +Example 1: + +Input: nums = [1,2,3,4,5,6,7], k = 3 +Output: [5,6,7,1,2,3,4] +Explanation: +rotate 1 steps to the right: [7,1,2,3,4,5,6] +rotate 2 steps to the right: [6,7,1,2,3,4,5] +rotate 3 steps to the right: [5,6,7,1,2,3,4] + +Example 2: + +Input: nums = [-1,-100,3,99], k = 2 +Output: [3,99,-1,-100] +Explanation: +rotate 1 steps to the right: [99,-1,-100,3] +rotate 2 steps to the right: [3,99,-1,-100] + + + +Constraints: + + • 1 <= nums.length <= 10^5 + + • -2^31 <= nums[i] <= 2^31 - 1 + + • 0 <= k <= 10^5 + + + +Follow up: + +• Try to come up with as many solutions as you can. There are at +least three different ways to solve this problem. + + • Could you do it in-place with O(1) extra space? +""" + + +class Solution: + def rotate(self, nums: list[int], k: int) -> None: + N = len(nums) - 1 + cut = k % len(nums) + + def reverse(l, r): + while l <= r: + nums[l], nums[r] = nums[r], nums[l] + l += 1 + r -= 1 + + reverse(0, N) + reverse(0, cut - 1) + reverse(cut, N)