算法入门2——双指针

算法入门2——双指针

双指针有三种,快慢指针,对撞指针,滑动窗口,说是指针其实也不是完全是指针形式,可以是下标,也可以是两个标志位的移动,记录leecode的双指针的例题,其实现实做题中肯定也是有用到类似形式,只是不知道是双指针,leecode的这一例题,主要学习到数组反转的妙用,虽然数组反转的空间复杂度下降,但是却没有直接在开辟一个数组执行的时间快,我自己写了两三次这一题,两次都是超时。
例题如下:原题传送门
在这里插入图片描述
我之前写的超时的。。。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
            int n = nums.size()-1;
            int i,j,p;
            int tmp;
            for(i = 1;i <= k;i++)
            {
                tmp = nums[n];
                for(j = n,p = n-1;j>=1,p>=0;j--,p--)
                {
                    nums[j]=nums[p];
                }
                nums[0]=tmp;
            }
    }
};

成功通过的,(参考官方解法)

class Solution {
public:
    // //法1:翻转数组
    // void reserve(vector<int>& nums,int begin,int end){
    //     while(begin<end)
    //     {
    //         swap(nums[begin],nums[end]);
    //         begin++;
    //         end--;
    //     }
        
    // }
    // void rotate(vector<int>& nums, int k) {
    //     k = k%nums.size();
    //     reserve(nums,0,nums.size()-1);
    //     reserve(nums,0,k-1);
    //     reserve(nums,k,nums.size()-1);
    // }
    //法2:

    void rotate(vector<int>& nums, int k) {
        vector<int> arr(nums.size());
        for(int i = 0 ;i<nums.size();i++)
        {
            arr[(i+k)%nums.size()] = nums[i];
        }
        nums.assign(arr.begin(),arr.end());
    }
};

在这里插入图片描述
解法2比解法1快了一倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值