80. 删除有序数组中的重复项 II
80. 删除有序数组中的重复项 II
https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envType=study-plan-v2&envId=top-interview-150
思路
left指向第一个字符,
right指向第二个字符, 做值相等性判断,
如果right指向字符跟left相等,则需要另外一个指针right_end, 去寻找right后,第一个值不等于left,
left+1位置复制left位置的值
left+2 位置复制right_end位置的值,
left 赋值为 left+2
right 赋值为 right_end+1
否则,
left+1 位置复制right值
left 赋值为 left+1
right 赋值为 right+1
Code
class Solution { public: int removeDuplicates(vector<int>& nums) { int nums_len = nums.size(); if (nums_len <= 2) return nums_len; int left = 0; int right = 1; while(left < right && right < nums_len){ // cout << "left=" << left << ", right=" << right << endl; if (nums[left] == nums[right]){ /* 0 0 0 0 0 0 1 1 2 2 ! ! ! left right right_end */ int right_end = right + 1; if (right_end >= nums_len){ nums[++left] = nums[right]; break; } // cout << "out right_end=" << right_end; while(right_end < nums_len){ // cout << "out right_end=" << right_end; if(nums[right_end] == nums[right]){ right_end++; if (right_end >= nums_len){ nums[++left] = nums[right]; right = right_end; break; } } else { nums[++left] = nums[right]; nums[++left] = nums[right_end]; right = right_end+1; break; } } } else { /* 0 0 0 0 0 0 1 2 2 2 ! ! ! left right right_end -> after if branch -> 0 0 1 0 0 0 1 2 2 2 ! ! left right */ nums[++left] = nums[right]; right++; } } return left+1; } };
出处:http://www.cnblogs.com/lightsong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。