No.80 Remove Duplicates from Sorted Array ||
Remove Duplicates from Sorted Array||
Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array nums = [1,1,1,2,2,3]
,
Your function should return length = 5
, with the first five elements of nums being 1
, 1
, 2
, 2
and 3
. It doesn't matter what you leave beyond the new length.
Tags: Array Two Pointers
移除有序数组中出现次数超过两次的数字
要求:原地移除,不能使用额外空间;返回新数组的长度
要求:原地移除,不能使用额外空间;返回新数组的长度
1 #include "stdafx.h" 2 #include <map> 3 #include <vector> 4 #include <iostream> 5 using namespace std; 6 7 class Solution 8 { 9 public: 10 int removeDuplicates(vector<int> &nums) 11 {//移除有序数组中出现次数超过两次的数字 12 //要求:原地移除,不能使用额外空间;返回新数组的长度 13 14 int size = nums.size(); 15 if(size <= 2) 16 return size; 17 int index = 0;//已确定的最后索引 18 bool isTwice = false;//是否一出现两次 19 for(int i=1; i<size; i++) 20 { 21 if(nums[i] != nums[index]) 22 { 23 nums[++index] = nums[i]; 24 isTwice = false; 25 } 26 else 27 { 28 if(!isTwice)//重复,但此时为第二次出现 29 { 30 nums[++index] = nums[i]; 31 isTwice = true; 32 } 33 } 34 } 35 nums.erase(nums.begin()+index+1, nums.end()); 36 return index+1; 37 } 38 }; 39 40 int main() 41 { 42 Solution sol; 43 int data[] = {1,1,1,2,2,3,3,3,3,3,4,5}; 44 vector<int> test(data,data+sizeof(data)/sizeof(int)); 45 for(const auto &i : test) 46 cout << i << " "; 47 cout << endl; 48 cout<< boolalpha << sol.removeDuplicates(test)<<endl; 49 for(const auto &i : test) 50 cout << i << " "; 51 cout << endl; 52 }
其实,还有一种更简单的做法,不用isTwice标识,直接比较nums[index-1]即可[因为是排序过的]!!
1 class Solution 2 { 3 public: 4 int removeDuplicates(vector<int> &nums) 5 {//移除有序数组中出现次数超过两次的数字 6 //要求:原地移除,不能使用额外空间;返回新数组的长度 7 8 int size = nums.size(); 9 if(size <= 2) 10 return size; 11 int index = 1;//已确定的最后索引 12 13 for(int i=2; i<size; i++)//i从2开始 14 { 15 if(nums[i] != nums[index-1]) 16 nums[++index] = nums[i]; 17 } 18 nums.erase(nums.begin()+index+1, nums.end()); 19 return index+1; 20 } 21 };