From b0e40f34e43cdcdc1190f76836c9db94a1346ebc Mon Sep 17 00:00:00 2001 From: "legolas.zhan" Date: Wed, 14 Aug 2024 14:31:50 +0800 Subject: [PATCH] s189: do it in-place with O(1) extra space --- leetcode/array/rotate.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/leetcode/array/rotate.go b/leetcode/array/rotate.go index af951bdd..7e37a33e 100644 --- a/leetcode/array/rotate.go +++ b/leetcode/array/rotate.go @@ -39,6 +39,7 @@ Try to come up as many solutions as you can, there are at least 3 different ways package larray +/* func rotate(nums []int, k int) { n := len(nums) c := make([]int, n) @@ -50,3 +51,25 @@ func rotate(nums []int, k int) { nums[(i+k)%n] = v } } +*/ + +func rotate(nums []int, k int) { + n := len(nums) + k = k % n + if k == 0 { + return + } + + var reverse func(nums []int, start, end int) + reverse = func(nums []int, start, end int) { + for start < end { + nums[start], nums[end] = nums[end], nums[start] + start++ + end-- + } + } + + reverse(nums, 0, n-1) // Reverse the entire array + reverse(nums, 0, k-1) // Reverse the first k elements + reverse(nums, k, n-1) // Reverse the remaining n - k elements +}