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  阅读(209)  评论(0编辑  收藏  举报

导航