27. 移除元素

27. 移除元素

力扣题目链接
我的代码:左右指针交换,O(n)

class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums.length == 0) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == val) {
                count++;
            }
        }
        int l = 0;
        int r = nums.length - 1;
        while (l < r) {
            while (l < nums.length && nums[l] != val) {
                l++;
            }
            while (r > 0 && nums[r] == val) {
                r--;
            }
            if (r > 0 && l < nums.length && l < r && nums[l] == val) {
                int temp = nums[r];
                nums[r] = nums[l];
                nums[l] = temp;
                l++;
                r--;
            }
        }
        return nums.length - count;
    }
}

和我类似的方法:比我的好

class Solution {
    public int removeElement(int[] nums, int val) {
        // 双指针
        int left = 0, length = nums.length, right = length - 1;

        // 当left 移动到 right的右侧时说明遍历完成,退出循环
        while (left <= right){
            // 先把right指针移动到第一个不是val的地方
            if(nums[right] == val){
                right--;
                continue;
            }

            // 判断left指针的元素是否是val,如果是则将right指针的元素替换过来
            // 否则left指针右移
            if(nums[left] == val){
                nums[left++] = nums[right--];
            }else{
                left++;
            }
        }

        // 如果nums里都是val,right指针就是-1了;
        // 否则需要判断一下right指针的元素是否是val
        return right < 0 ? 0 : nums[right] == val ? right : right + 1;
    }
}

妙解

public int removeElement(int[] nums, int val) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] != val) {
                nums[count++] = nums[i];
            }
        }
        return count;
}
posted @ 2022-12-12 21:59  Cyrui_13  阅读(19)  评论(0编辑  收藏  举报