快慢指针
原地修改数组元素
26. 删除有序数组中的重复项 - 力扣(LeetCode)这里我们选择用两种解法,第一种是用map去重,然后将值依次赋给nums;第二种是用快慢指针的思想
class Solution {
public:int removeDuplicates(vector<int>& nums) {/*第一种:map*/map<int,int> m;int len=nums.size();for(int i=0;i<len;i++){m[nums[i]]=1;}int cnt=0;for(auto i:m){nums[cnt++]=i.first;}return cnt;}
};
class Solution {
public:int removeDuplicates(vector<int>& nums) {/*第二种:快慢指针*/int len=nums.size();int left=0;int right=1;while(right<len){if(nums[left]==nums[right]){right++;}else{left++;nums[left]=nums[right];right++;}}return left+1;}
};
27. 移除元素 - 力扣(LeetCode) 思想与第一题一致,因为限制空间,所以没法用map去重(并且数组无序),请一定要注意双指针思想,因为当数组长度很大时,这个方法就显得尤为重要!
class Solution {
public:int removeElement(vector<int>& nums, int val) {int len=nums.size();int left=0;int right=0;while(right<len){if(nums[right]==val){right++;}else{nums[left]=nums[right];left++;right++;}}return left;}
};
283. 移动零 - 力扣(LeetCode)真的不要太简单~,原地修改数组,请用双指针,当这种思想用到了别的题目时,记得会用哦
class Solution {
public:void moveZeroes(vector<int>& nums) {/*是不是就是原地修改数组类型,双指针!*/int len=nums.size();int left=0;int right=0;while(right<len){if(nums[right]==0){right++;}else{nums[left]=nums[right];left++;right++;}}for(int i=left;i<len;i++){nums[i]=0;}}
};
滑动窗口(过几日回来补)
明天继续更左右指针~
参考:
双指针技巧秒杀七道数组题目 | labuladong 的算法笔记