美文网首页
Remove Duplicates from Sorted Ar

Remove Duplicates from Sorted Ar

作者: 瞬铭 | 来源:发表于2019-03-21 15:47 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Remove Duplicates from Sorted Ar

          本文链接:https://www.haomeiwen.com/subject/lwqcvqtx.html