删除已排序数组的重复元素,返回数组处理后的新长度。
要求空间复杂度为1.
【思路】
一道水题,折腾了一个多小时。
1)原来的思路:从后向前遍历元素,遇到和前一个相同的则记为一个不可能的数(比如A[0]-1,假设是0),
然后从前向后遍历,两个标记,遇到0就不复制。在这个地方遇到问题,总是出错?
【更新】见下my code。繁琐了些,但是可以用。
2)key保存要复制的值,一个标记start边遍历边计数。
和key不同的,就把key放入start,start指向下一个,key赋新值。
和key相同的,do nothing,继续向下遍历
(多么顺的思路,还是做得题太少)
【other code】
int removeDuplicates(int A[], int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if (n == 0) return 0; int start = 0; int key = A[0]; for(int i = 0; i < n; i++) if (A[i] != key) { A[start++] = key; key = A[i]; } A[start++] = key; return start; }
【my code】
int removeduplicate(int A[], int n) { //为什么不覆盖 int length=n; int unavailable=A[0]-1; for(int i=n-1; i>0; i--) if(A[i]==A[i-1]){ length--; A[i]=unavailable; } int j=1; for(int i=1; i<n&&j<length; i++){ if(A[i]!=unavailable){ A[j++]=A[i]; } } return length; }
【总结】
只要考虑一种情况就可以:何时保留。
不需要考虑重复时该怎么处理,只要控制了保留就能覆盖掉。