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 };

 

 

 

 

posted @ 2015-06-11 17:12  人生不酱油  阅读(163)  评论(0编辑  收藏  举报