leetcode189 旋转数组

给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1.
每次交换k长度的数据
先简单地将数组看作k的整数倍长度,划分为多个k长度的区间,那么旋转时,最后一段k区间,一定会移动到第一段k区间,所以这时可以交换最后一段和第一段k区间的值,这时第一段的k区间就是旋转好的部分,而原来的第一段区间就变成了最后一段,原本第一段应该移动到第二段区间,此时正好可以将第二段区间视作新的第一段区间,继续交换,以此类推。而实际上数组长度len一般会是k的整数倍+X(k%=len),所以再最后一部分交换时会出现(剩余数组长度<2*k)的情况,这时交换部分存在重叠,所以此时交换后的剩余部分(<k实际上并未移动完成),

如同所示为最后一部分,其中A1长度等于C2等于B,A2=A1,先交换前一部分,则有
在这里插入图片描述
再继续交换
在这里插入图片描述
最后再次交换
在这里插入图片描述
此时前面的K就是已经旋转的了,可以看出后面的小于K的部分依然不是我们想要的,我们继续旋转的话,要继续对K进行取余操作,过滤掉无意义操作,(k%=(当前区间长度)),这时新的区间就又可以视作之前相同的最后部分处理,那么我们不断重复操作,知道K为0时,不再交换,也就完成整个数组的旋转,。//循环过程中不断减少需要旋转的区间长度

代码如下class Solution {
public static void rotate(int[] nums, int k) {
int len=nums.length;
k%=len;
if(k<=0)return;
for(int strat=0;strat<nums.length&&k!=0;len-=k,strat+=k,k%=len){
for(int j=0;j<k;++j){
int a=strat+j;
int b=nums.length-k+j;
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}
}
}

方法2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值