双指针数组(对应Leecode-27,26,977)-创新互联

双指针数组

成都创新互联公司2013年开创至今,先为城中等服务建站,城中等地企业,进行企业商务咨询服务。为城中企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。文章目录
  • 双指针数组
  • 双指针数组介绍
  • 示例题型(对应Leecode题号)
    • 27.移除元素
    • 26.删除有序数组中的重复项
    • 977.有序数组的平方
  • 总结


双指针数组介绍

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

示例题型(对应Leecode题号) 27.移除元素

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

class Solution {public:
    int removeElement(vector& nums, int val) { int j=0; //慢数组
         if(nums.size()==0)
         {  return 0;   
         }
         else
         { for(int i =0;i if(nums[i] != val)
                 { nums[j] = nums[i];//当条件成立时  慢数组下标往后移动
                     j++;
                 }
             }
         }
         return j;
    }
};
26.删除有序数组中的重复项

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

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

      }
      return j+1;
    }
};
977.有序数组的平方

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

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

总结

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:双指针数组(对应Leecode-27,26,977)-创新互联
网站链接:http://azwzsj.com/article/hijop.html