1.删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function removeDuplicates(&$nums) {
$index=0;
for ($i=1; $i <count($nums) ; $i++) {
if ($nums[$index]==$nums[$i]) {
continue;
}else{
$nums[++$index]=$nums[$i];
}
}
return ($index+1);
}
}
tips:常量空间:当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记 作O(1)
解析:左右指针用法
容易犯错误的点:
题目理解不清:
①有序数组意味着重复的元素一定靠在一起,②返回新数组长度意味着不需要一个真正的数组
说白了这题是在给重复元素会靠在一起的情况下,算出重复元素之外的元素个数(数组长度),也就是数个数
左右指针意思是,左指针负责计数,右指针负责遍历所有元素
①当左右相等则右指针继续右移,如果左右不等则将右指针移到左指针后一位,这样的话左指针前进的唯一条件就是一定有一个不同的数组加入到了左指针的地盘,那么保证了左指针左半边都是不重复的,然后只要将左指针的值+1当做长度发送出去即可,因为左指针并不相当于长度就像数组下标实际比数组长度要少1;
思路解析:左右指针
左右指针这个想法实际上是有两步,把一个不合规范的数组分成两部分,无论左右,但一般是左右各一部分,右边是不合规范且需要调整的,左边是已经调整且符合规范的。
我们只需要找到一个方法能够完美区分左右且不会有遗漏元素就行。