Remove Duplicates from Sorted Array
我的思路:如果一个一个比较的话就是太野蛮的写法了,可以先排序在处理
关于排序函数参看:http://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html
(在本题中题目上说了Given a sorted array,人家已经排好序啦``````)
刚开始写的,结果:Time Limit Exceeded
1 class Solution { 2 public: 3 int removeDuplicates(int A[], int n) { 4 if(n<=1) 5 { 6 return n; 7 } 8 9 int i,j; 10 for(i=0;i<n-1;++i) 11 { 12 if(A[i]==A[i+1]) 13 { 14 for(j=i;j<n;++j) 15 { 16 A[j]=A[j+1]; 17 } 18 n--; 19 } 20 } 21 return n; 22 } 23 };
其实这样写也不对,比如
int a[] = {1,1,1};
cout<<removeDuplicates(a,3)<<endl;
为什么一定要从前往后比呀,这样如果有相同的话,每次还要移动大量的元素,可以从后向前比呀,其实差不多的。
为什么每一次比较完成后就急于把所有元素都移动呀,也可以先攒着,这样,
比如说 1,1,2,3,发现相同的,那就把第二个后面那个给放到第二个那个地方去,什么时间结束需要判断一下,过程如下:
1,1,2,3——>1,2,2,3——>1,2,3,3
但是,如果是1,1,1,2,3的话就不行了,是个死循环了。
可以这样:
AC,代码如下:
1 class Solution { 2 public: 3 int removeDuplicates(int A[], int n) { 4 if(n<=1) 5 { 6 return n; 7 } 8 int i,j; 9 i=0; 10 j=1; 11 while(j<n) 12 { 13 if(A[i]==A[j]) 14 { 15 j++; 16 } 17 else 18 { 19 A[i+1]=A[j]; 20 i++; 21 j++; 22 } 23 } 24 return i+1; //返回的是i+1,不是i,因为数组下标从0开始的 25 } 26 };
posted on 2014-03-05 18:38 crane_practice 阅读(210) 评论(0) 编辑 收藏 举报