题目: 删除有序数组中的重复项

来自智得网
跳转至: 导航、​ 搜索

分析

Hash法

处理重复项需要循环处理数组中的每个数字。

使用一个 Hash 表保存已经遍历过的数字用于数组的去重。

用变量 k 记录最终数组中无重复数字的位置,

遍历数组中的每个数字,如果数字第一次出现,则将 k 进行加一, 同时将该数字存入 Hash 表,如果 Hash 表已经存在该数字,则继续往后处理。

数组循环结束之后返回 k 的值即可。

双指针

由于题目中的数组是已经升序排序的数组,相同的元素在数组中的位置相邻。所以就不需要使用 Hash 表进行去重,可以使用双指针的方法求解。

定义两个指针 i 和 j 分别指向数组的第一个元素,指针 j 循环向后移动。

在移动的过程中,比较两个指针指向的值,

如果两个值相等,那就说明是重复的元素, i 的位置不变。

如果两个元素不一样,那么就将指针 i 后移一位,并且将指针 j 指向的值拷贝到指针 i 的位置

继续上述的过程,当循环结束,i + 1 就是去重后数组的长度。

public class Solution{
    public int solute(int[] nums) {
      int i, j = 0;
      for (i = 0, j = 0; j < nums.length; j++) {
        if (nums[i] != nums[j]) {
          nums[++i] = nums[j];
        }
      }
      return i + 1;
    }
}