27. 移除元素


双指针法

class Solution {
    public int removeElement(int[] nums, int val) {

        /**
         * 使用双指针从两端遍历,start指向当前遍历元素,end指向最后一个待换元素
         * 当遇到目标元素时,和最后一个元素互换
         * 头指针等于尾指针时结束循环
         */
        if (nums == null || nums.length == 0){
            return 0;
        }

        int start = 0;
        int end = nums.length - 1;
        int temp = 0;

        while (start < end){

            if (nums[start] == val){

                temp = nums[start];
                nums[start] = nums[end];
                nums[end] = temp;
                end--;
            }
            else {
                start++;
            }
        }

        /**
         * 最后要判断最后停留的位置是否是目标元素,如果是的话就要舍弃
         * 因为要加1,为了避免end + 1边界溢出,让start + 1
         */
        if (nums[start] != val){
            return start + 1;
        }
        else {
            return start;
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化2——不使用额外空间、合并数组为空的情况且简化返回值

class Solution {
    public int removeElement(int[] nums, int val) {

        /**
         * 使用双指针从两端遍历,start指向当前遍历元素,end指向最后一个待换元素
         * 当遇到目标元素时,让最后一个元素直接覆盖
         * 头指针大于尾指针时结束循环
         */
        int start = 0;
        int end = nums.length - 1;

        while (start <= end){

            if (nums[start] == val){

                nums[start] = nums[end];
                end--;
            }
            else {
                start++;
            }
        }

        /**
         * start就是剩余数组元素的个数
         */
        return start;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/remove-element/