目标

给定一个非严格递增排列的数组,原地删除重复出现的元素,使得每个元素只出现一次,返回删除数组后的新长度,元素的相对顺序保持一致

1.最快的解法

public function removeDuplicates()
    {
        $array = [1,2,3,3,5,4];
//        $nums = array_keys(array_flip($array));
        $nums = array_unique(($array));
        return count($nums);
    }

2.常规解法

public function removeDuplicates1()
{
    $array = [1,2,3,3,5,4];
    $num = count($array);
    for ($i=$num-1;$i>0;--$i){
       if ($array[$i] == $array[$i-1]){
           unset($array[$i]);
       }
    }
}

3.双指针解法

public function removeDuplicates2()
{
    $array = [1,1];//数组是有序的,重复的元素一定会相邻 在同一个数组里面操作,也就是不重复的元素移到数组的左侧,最后取左侧的数组的值。
    $num = count($array);
    if ($num <= 1) {
        return $num;
    }
    // 双指针,快慢指针
    // 慢指针及其之前的元素为所有不重复的元素,快指针一次遍历
    //就是拿相邻的两个元素进行比较,如果不相等就放到慢指针数组里面
    $slow = 0;
    for ($fast=1;$fast<$num;++$fast){
        if ($array[$fast] != $array[$slow]){
            $slow++;
            //减少不必要的原地交换,应对[1,1,1,1,2]这个情况
            if ($slow!=$fast){//不等于时先把满慢指针右移,然后快指针赋值给慢指针
                $array[$slow] = $array[$fast];
            }
        }
    }
    // 返回不重复数字个数
    return $slow + 1;