标签:
Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
For example,
Given input array A = [1,1,2]
,
Your function should return length = 2
, and A is now [1,2]
.
Array Two Pointers
开始的想法比较直接,就是从第二个开始,若发现与前面的相同,则从这一个开始依次将后面的数据复制给前面的数据,发现提交代码后超时间了,说明这种的时间复杂度太大了,不是好的算法。
#include<iostream> using namespace std; int removeDuplicates(int A[], int n) { if(n==1) return 1; if(n==2) { if(A[0]==A[1]) return 1; else return 2; } for(int i=0;i<n-2;i++) { if(A[i+1]==A[i]) { for(int j=i+1;j<=n-2;j++) { A[j]=A[j+1]; } } } int len=1; for(int i=0;i<n;i++) { if(A[i+1]!=A[i]) len++; else break; } return len; } int main() { int A[7]={1,2,3,3,4,5,6}; cout<<removeDuplicates(A,7)<<endl; int n=removeDuplicates(A,7); for(int i=0;i<n;i++) cout<<A[i]<<endl; }
上面的算法显然时间复杂度太高了,是不行的,所以得想更巧妙点的法子,设置两个指针i和j,j是从前往后遍历,若遇到与前面不同的则将j坐标的A[j]给前面A[i+1],然后将i+1,即前面的指针才往后移一位,这样依次往后,到最后的时候,i+1的值即为数组后来结果的大小
#include<iostream> using namespace std; int removeDuplicates(int A[], int n) { if(n==0) return 0; if(n==1) return 1; int i=0; int j=1; while(j<n) { if(A[j]>A[j-1]) { if(j!=(i+1)) A[i+1]=A[j]; i++; j++; } else j++; } return i+1; } int main() { int A[2]={1,1}; cout<<removeDuplicates(A,2)<<endl; int n=removeDuplicates(A,2); for(int i=0;i<n;i++) cout<<A[i]<<endl; }
leetcode_26题——Remove Duplicates from Sorted Array (string)
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4457954.html