LeetCode——旋转数组

算法习题 专栏收录该内容
4 篇文章 0 订阅

一、题目描述

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

输入: nums = [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:

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

二、解题方法

方法一:
保存最后一个值,前n-1个值一次向后挪一位,再将保存的值放入第一个位置,重复k次。时间复杂度为O(N*k)

方法二:
创建一个大小为N的临时数组,将原数组中后k个值拷贝到新建数组中前K个位置,原数组中前n-k个值拷贝到新建数组中后n-k个位置。

示例:
[ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] k=3
[ 5 , 6 , 7 , 1 , 2 , 3 , 4 ]

在这里插入图片描述
时间复杂度为O(N),空间复杂度为O(N)

方法三:
将原数组进行三段逆置:
1、将前n-k个元素逆置
2、将后k个元素逆置
示例:
[ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] k=3
[ 5 , 6 , 7 , 1 , 2 , 3 , 4 ]
在这里插入图片描述
时间复杂度为O(N),空间复杂度为O(1)

经过对比时间复杂度和空间复杂度得方法三为最优算法,下面给出方法三的算法代码:

void reverse(int* nums,int a,int b){
    int j;
    while(a<=b){
        j=nums[a];
        nums[a]=nums[b];
        nums[b]=j;
        a++;
        b--;
    }
}//逆置函数

void rotate(int* nums, int numsSize, int k){
    k=k%numsSize;
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
}
  • 4
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值