Go实现算法:旋转数组(LeetCode)

题目:

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(1) 的 原地 算法。

解题思路:原地算法,使用经典的三次反转:先反转前n-k个数字,再反转后k个数字,再统一反转。

func rotate(nums []int, k int) {

k=k%len(nums)

ro(nums[:len(nums)-k])

ro(nums[len(nums)-k:])

ro(nums)

}

//反转数组

func ro(nums []int){

for i,j:=0,len(nums)-1;i

nums[i],nums[j]=nums[j],nums[i]

i++

j--

}

}

运行时间76ms

--------------------

查看大神的代码,效率杠杠的。思路:取后n-k个字符拼上前k个字符,省去了反转操作。

func rotate(nums []int, k int) { length := len(nums) k = k % length copy(nums,append(nums[length-k:], nums[:length-k]...)) }

运行时间64ms

Go实现算法:旋转数组(LeetCode)


分享到:


相關文章: