双指针数组(对应Leecode-27,26,977)

双指针数组


双指针数组介绍

例如:双指针数组中的指针并非我们常见的c语言指针,它更多指的是对数组下标操作的两种标量。
他大体可以分为两类,一类是快慢指针,一个是头尾指针。
我们可以借助下面的两张图帮助我们理解
(我们根据题型来选这二者)
头尾
快慢

示例题型(对应Leecode题号)

27.移除元素

代码如下(示例):
我们先从简单的开始入手,其实这个题就可以利用快慢数组。
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
         int j=0; //慢数组
         if(nums.size()==0)
         {
          return 0;   
         }
         else
         {
             for(int i =0;i<nums.size();i++)
             {
                 if(nums[i] != val)
                 {
                     nums[j] = nums[i];//当条件成立时  慢数组下标往后移动
                     j++;
                 }
             }
         }
         return j;
    }
};

26.删除有序数组中的重复项

代码如下(示例):
这个题更为典型 是一个经典的快慢数组题 ++j = i++ 是解决这类问题的核心
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
      int j = 0;//慢数组
      for(int i=1;i<nums.size();i++)
      {
         if(nums[j]!=nums[i])
         {
             nums[++j] = nums[i];//通过判断条件来使慢数组下标往后移
         }

      }
      return j+1;
    }
};

977.有序数组的平方

代码如下(示例):
这是一个经典的双指针应用题
无从下手时,多回忆回忆作者在上面画的 left-right图
在这里插入图片描述

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
     int left = 0;
     int right = nums.size()-1;
       vector<int> result(nums.size(), 0);//创建新数组保存平方后的数据
     int k = nums.size() -1;//用来指向新数组下标
     while(left<=right)
     {
         if(nums[left]*nums[left]<nums[right]*nums[right])
         {
             result[k--] = nums[right]*nums[right];//因为新数组时从小到大  我们从后面开始填充元素
             right --;//结合图  结合图  结合图  重要的事情说三遍
         }
         else
         {
             result[k--] = nums[left]*nums[left];//左右开始 比较左右元素的大小 谁大谁放进去 并且将位置移动到下一侧
             left++;
         }
     }
     return result;
    }
};

总结

这类题刚入手时可能有点难度,但只要理解了双指针思想,便可以很快解决这一类题型。
作者题型:大家初刷Leecode倒也不用过分在意时间 空间复杂度,刷多了自然就会优化了。
一起加油~~~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值