【引言】
本题是面试中经常被问到的算法基础题,解决这类问题的方法也很多,常用的就是所谓的“双指针”方法。在遇到需要对数组或者链表中元素进行比较时,就可以利用两个指针遍历数组或者链表来达到目的。一般而言这两个指针可以在同一端做同向移动,也可以在两端做相向移动,不同问题中指针移动速度也不尽相同。
【解题思路】
对于本题,由于给定的是一个有序数组,可以直接利用双指针来解决。方法如下:
使用两个下标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; // 返回新数组的长度
}
本文介绍了一种使用双指针方法去除有序数组中的重复元素,并返回新数组长度的算法。该方法适用于对数组进行去重操作,有效提升数据处理效率。

1407

被折叠的 条评论
为什么被折叠?



