189. 轮转数组

66 阅读1分钟

题目:
给定一个整数数组 nums,将数组中的元素向右轮转 k **个位置,其中 k **是非负数。

算法:
方法一:额外数组
将nums[i]放到tmp[i + k mod n],最后将tmp copy 到nums

func rotate(nums []int, k int)  {
    n := len(nums)
    tmp := make([]int, n)
    for i := 0; i < n; i ++ {
        tmp[(i + k ) % n] = nums[i]
    }
    copy(nums, tmp)
}

方法二:旋转数组

func rotate(nums []int, k int)  {
    n := len(nums)
    //因为k可能大于n 
    k = k % n
    reverse(nums, 0, n - 1)
    reverse(nums, 0, k - 1)
    reverse(nums, k, n - 1)
}


func reverse(nums []int, i, j int) {
    for i < j {
        nums[i], nums[j] = nums[j], nums[i]
        i ++
        j --
    }
}