【引言】
本題是面試中經常被問到的算法基礎題,解決這類問題的方法也很多,常用的就是所謂的“雙指針”方法。在遇到需要對數組或者鏈表中元素進行比較時,就可以利用兩個指針遍歷數組或者鏈表來達到目的。一般而言這兩個指針可以在同一端做同向移動,也可以在兩端做相向移動,不同問題中指針移動速度也不盡相同。
【解題思路】
對於本題,由於給定的是一個有序數組,可以直接利用雙指針來解決。方法如下:
使用兩個下標i和j,其中i用於記錄去重後所得新數組最後一個元素的位置,j用於遍歷整個數組,i和j同向移動,通過j移動來帶動i的移動。在處理中,當遇到j和i所指向的元素值不同時,把j所指元素的值拷貝到新數組最後一個位置(i所在位置),然後將i向後移動一位。當遇到j和i所指的元素值相同時,不對i進行處理,只移動j,這樣就能保證i遍歷過得元素值各不相同。
【代碼】
// 有序數組去重,返回新數組長度
int removeDuplicates(int A[]) {
int i = 0; // 第一個指針
int j; // 第二個指針
int n = A.length;
if (n <=1 ) return n;
// 遍歷數組
for (j = 1; j < n; j++) {
if (A[j] != A[i]) { // 若兩個指針所指元素不同,則i+1位置保存j所指元素的值
A[++i] = A[j];
}
}
return i+1; // 返回新數組的長度
}