https://leetcode.com/problems/remove-duplicates-from-sorted-array/
对一个已经排序好的数组去重,要求不开辟新空间,并且保证数组下标0开始往后是重复的。剩余尾部忽略
快慢指针,当发现快指针的数字和慢指针的值相同,快指针+1。如果发现不相同,将快指针赋予到慢指针的下一个,并且同时将快指针+1;
/**
* @param Integer[] $nums
* @return Integer
*/
function removeDuplicates(&$nums) {
$i = 0;
$j = 0;
while ($j < count($nums)) {
if ($nums[$i] == $nums[$j]) {
$j++;
}else{
$i++;
$nums[$i] = $nums[$j];
$j++;
}
}
return $i + 1;
}
https://leetcode.com/problems/remove-element/
对于一个数组,给定一个数组中已经包含的值val,从数组中剔除掉所有的val,并保证剩余的值在数组的前列
直接遍历一遍数组,一个指针记录数组从头开始的边界,当遍历发现不等于val,就将该值赋给边界上的指针
function removeElement(&$nums, $val) {
$pos = 0;
foreach($nums as $k=>$v){
if($v != $val){
$nums[$pos] = $v;
$pos++;
}
}
return $pos;
}
这个是最开始的解法,方法没毛病,但是有个bug,就是输入为nums = [1],val=1,这个算法会出问题,怎么解决???
function removeElement(&$nums, $val) {
$j = count($nums) - 1;
while ($i < $j) {
while ($i < $j && $nums[$j] == $val) {
$j--;
}
while ($i < $j && $nums[$i] != $val) {
$i++;
}
$tmp = $nums[$i];
$nums[$i] = $nums[$j];
$nums[$j] = $tmp;
}
return $i+1;
}
}