目标
给定一个非严格递增排列的数组,原地删除重复出现的元素,使得每个元素只出现一次,返回删除数组后的新长度,元素的相对顺序保持一致
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;