zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3582906.html
Copyright © 2011-2022 走看看