LeetCode189.旋转数组

这个博客就用来记录学习过程中遇到的一些问题吧,菜鸡一枚,欢迎各位大佬指正批评。


题目描述

  • 对数组nums进行循环右移k位

思路

先对前面部分进行反转(0,len-k-1),再对后面部分进行反转(len-k,nums.size()-1),最后对整个数组进行反转即可实现逻辑右移k位。1.

遇到的问题

提交编译的时候遇到了数组越界问题:double free or corruption (out): 0x0000000001c77e70 *
检查后发现是没有考虑到k大于数组长度的情况,对代码进行修改后编译通过。

代码

class Solution {
public:
    void fanzhuan(vector<int>&nums,int first,int end){
        int mid=(first+end)/2;
        int key,j=end,i=first;
        for(;i<=mid;i++,j--){
            key=nums[i];
            nums[i]=nums[j];
            nums[j]=key;
        }
    }
    void rotate(vector<int>& nums, int k) {
       if(nums.size()>0){
           while(k>=nums.size()){
               k=(k-nums.size())%nums.size();
           }
           int len=nums.size();
           fanzhuan(nums,0,len-k-1);
           if(len-k>0&&len-k<len-1)
             fanzhuan(nums,len-k,len-1);
           fanzhuan(nums,0,len-1);
       }
    }
};

小小思考

循环右移的过程中,数组的先后顺序并没有改变,因此只是将后k部分移到数组头,即把(len-k,len-1)和(0,len-k-1)两部分进行交换。
设初始坐标为a,反转后的坐标f(a)如下:

f(a)={a+ka+klena<=lenk1a>=lenk f ( a ) = { a + k a <= l e n − k − 1 a + k − l e n a >= l e n − k

先看当a<=len-k-1时,第一次反转后的坐标为len-1-a-k,第二次反转后的坐标为(len-1)-(len-1-k-a)=a+k,可见算法成立。
a>=len-k的时候同理。

脚注

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值