Remove Duplicates from Sorted Ar

2019-03-21  本文已影响0人  瞬铭

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,并保证剩余的值在数组的前列

image.png

直接遍历一遍数组,一个指针记录数组从头开始的边界,当遍历发现不等于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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读