题目:
给定一个数组,将数组中的元素向右移动 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