美文网首页
旋转数组

旋转数组

作者: 小气的王二狗 | 来源:发表于2020-10-10 14:59 被阅读0次
image.png

方法一: 暴力解法

一步一步移动数组,将数组中的每个元素都往后走一步,将末尾的值放到起点
k步后就是想要的结果

func rotate(nums []int, k int)  {
   for i := 0; i < k; i++ {
        r := nums[len(nums)-1]
        for n := len(nums) - 1; n-1 >= 0; n-- {
            nums[n] = nums[n-1]
        }
        nums[0] = r
    }
}

时间复杂度: O(n*k)
空间复杂度: O(1)
没有额外空间被使用。

方法二: 使用额外的数组

计算出旋转后的数字所在的key值
(n+k)%len(nums)

func rotate(nums []int, k int)  {
    var newNums []int
    for n:=range nums{
        newNums = append(newNums,nums[n])
    }
    for n:=range newNums {
        nums[(n+k)%len(nums)] = newNums[n]
    }
    
}

时间复杂度: O(n)
将数字放到新的数组中需要一遍遍历,另一边来把新数组的元素拷贝回原数组。
空间复杂度: O(n)
另一个数组需要原数组长度的空间。

方法三: 环状替换

思路如图

方法四: 反转数组

func rotate(nums []int, k int)  {
    key:=k%len(nums)
    //将数组整个反转
    reverse(nums)
    //以k%len(nums)作为分界,分别反转
    reverse(nums[:key])
    reverse(nums[key:])
}

func reverse(nums []int)  {
    for i, j := 0, len(nums)-1; i < j; i, j = i+1, j-1 {
        nums[i], nums[j] = nums[j], nums[i]
    }
}

相关文章

  • [剑指offer]08-旋转数组的最小数字

    旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...

  • 旋转数组的最小值

    旋转数组的最小值 所谓旋转数组,即是递增有序数组旋转右移动若干位得到的数组,这里的右移和java里的>>>有点不同...

  • Day6 剑指offer:旋转数字的最小数

    把一个数组最开始的若干个数组搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组...

  • 39. 恢复旋转排序数组

    给定一个旋转排序数组,在原地恢复其排序。说明:什么是旋转数组?比如,原始数组为[1,2,3,4], 则其旋转数组可...

  • 剑指Offer算法题-旋转数组的最小数字--Swift

    题目:把一个数组最开始的若干个元素搬到数组的尾部,我们称之为数组的旋转。输入一个递增数组的旋转,输出旋转数组的最小...

  • [查找和排序]旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 面试题11: 旋转数组的最小数字

    题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组...

  • 数组旋转

    数组旋转运行时限: 1000 ms 单次运行时限: 1000 ms 内存限制: 32 MB总提交: 206...

  • 每日一题 [10]-旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组...

网友评论

      本文标题:旋转数组

      本文链接:https://www.haomeiwen.com/subject/gyxdpktx.html