思路:只需掌握一个套路,如何移动下标从当前位置找到第一个不等于当前位置值的下标???
模板如下
int temp = i;
while(temp<nums.size()&&nums[temp]==nums[i])temp++;
i =temp;
删除删除有序数组中的重复项
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int cur = 0;
for(int i=0;i<nums.size();){
//填上cur对应的位置,cur往后移一位
nums[cur++] = nums[i];
//移动下标从当前位置找到第一个不等于当前位置值的下标
int temp = i;
while(temp<nums.size()&&nums[temp]==nums[i])temp++;
i = temp;
}
return cur;
}
};
删除删除有序数组中的重复项2
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int cur = 0;
for(int i=0;i<nums.size();){
nums[cur++] = nums[i];
//防止越界
if(i==nums.size()-1)break;
//如果有连续的继续操作
if(nums[i+1]==nums[i]){
nums[cur++] = nums[i+1];
}
//移动下标从当前位置找到第一个不等于当前位置值的下标
int temp = i;
while(temp<nums.size()&&nums[temp]==nums[i])temp++;
i = temp;
}
return cur;
}
};
链表也是类似的
删除排序链表中的重复元素
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* p = head;
while(p){
//移动指针从当前位置找到第一个不等于当前位置val的链表节点指针
ListNode*temp =p;
while(temp!=NULL&&temp->val ==p->val)temp = temp->next;
//连接
p->next = temp;
p = temp;
}
return head;
}
};
删除排序链表中的重复元素 II
class Solution {
public:
ListNode* deleteDuplicates(ListNode* p) {
//if(!head)return NULL;
ListNode*dummy = new ListNode(-1);
dummy->next = p;
ListNode*pre =dummy;
while(p&&p->next){
if(p->next&&p->next->val!=p->val){
pre = p;
p = p->next;
continue;
}
//第二种情况
//pre位置不变
//移动指针从当前位置找到第一个不等于当前位置val的链表节点指针
auto temp = p;
while(temp&&temp->val==p->val)temp=temp->next;
p = temp;
//连接
pre->next = p;
}
return dummy->next;
}
};