code第一部分数组:从有序数组中移除重复的数据
第二题 从有序数组中移除重复的数据,但是可以保留2个重复的数。
For example, Given sorted array A = [1,1,1,2,2,3],
Your function should return length = 5, and A is now [1,1,2,2,3]
解决方法1:和上面一题很类似,但是需要加上一个计数器;
解决方法2:可以使用条件语句来判断:i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1];
源代码如下
#include <iostream> using namespace std; int removeduplicate(int a[],int n) { if (n==0) { return 0; } int count=1; int index=0; for (int i = 1; i < n; i++) { if (a[index]==a[i]) { if (count<2) { index++; a[index]=a[i]; count++; } } else { index++; a[index]=a[i]; count=1; } } return index+1; } int removeduplicate2(int a[],int n) { if (n==0) { return 0; } int index=0; int i; for (i = 0; i < n; i++) { if (i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1]) { continue; } a[index]=a[i]; index++; } return index; }
拓展
从无序数组中移除重复的数据,但是可以保留2个重复的数。
分析,因为是无序的,如果没有时间复杂度的要求,可以先排序,比如快排O(nlogn)时间复杂度;
但是如果有要求,可以使用hashmap来记录出现的次数,时间复杂度为O(N),空间复杂度也为O(N);
解决方案1:先排序,再去重;
解决方案2:使用hash表;
方案一源代码
时间复杂度O(nlogn),空间复杂度O(1);
#include <iostream> #include <algorithm> using namespace std; int removeduplicate(int a[],int n) { sort(a,a+n); if (n==0) { return 0; } int count=1; int index=0; for (int i = 1; i < n; i++) { if (a[index]==a[i]) { if (count<2) { index++; a[index]=a[i]; count++; } } else { index++; a[index]=a[i]; count=1; } } return index+1; } int removeduplicate2(int a[],int n) { sort(a,a+n); if (n==0) { return 0; } int index=0; int i; for (i = 0; i < n; i++) { if (i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1]) { continue; } a[index]=a[i]; index++; } return index; } int main() { int a[6]={1,2,1,2,1,3}; int ans=removeduplicate(a,6); cout<<ans<<endl; int b[6]={1,2,1,2,1,3}; int ans1=removeduplicate2(b,6); cout<<ans1<<endl; return 0; }
方案2源代码
#include <iostream> #include <map> using namespace std; /*typedef std::map<int,int> MAP; MAP my_map;*/ map<int,int> my_map; int removeduplicate(int a[],int n) { int i; int index=0; for (i = 0; i < n; i++) { if (my_map[a[i]]<2) { my_map[a[i]]++; a[index++]=a[i]; } else continue; } return index; } int main() { int a[6]={1,2,1,2,1,3}; int ans=removeduplicate(a,6); cout<<ans<<endl; return 0; }
测试通过!