LeetCode旋转数组的思考

LeetCode:逆转数组

探索初级算法

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



尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。

void  rd(int* nums,int start,int end){
    while(start<end){
        int temp;
        temp = nums[end];
        nums[end--] = nums[start];
        nums[start++] = temp;
    }
}               //反转数组算法
void rotate(int* nums, int numsSize, int k){
    if(numsSize<k){
        k = k % numsSize;
    rd(nums,0,numsSize-k-1);
    rd(nums,numsSize-k,numsSize-1);
    rd(nums,0,numsSize-1);
    }
    else{
    rd(nums,0,numsSize-k-1);
    rd(nums,numsSize-k,numsSize-1);
    rd(nums,0,numsSize-1);
    }
 
        
    //在这个算法中要注意k > numsSize的情况 这种情况下要用if进行讨论 
    //实际上如果k > numsSize ,可以将k对numsSize取余,结果是一样的
   
}

反转数组算法占用时间相比传统直接逆转算法少许多,能通过LeetCode的检测

思路较为新奇

**在这个算法中要注意k > numsSize的情况 这种情况下要用if进行讨论 
实际上如果k > numsSize ,可以将k对numsSize取余,结果是一样的**

时刻注意内存溢出的问题,一般以numsSize结尾都必须-1 以防止内存溢出

思路即是先反转前n-k个元素,再反转后k个元素,在全部反转

最后附上执行时间表

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值