Re;


27. Remove Element

public class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) return 0;
        int count = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] != val) {
                nums[count++] = nums[i];
            }
        }
        return count;
    }
}

26. Remove Duplicates from Sorted Array

和上面的27差不多,都是把后面合法元素覆盖到前面来。

public class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums == null || nums.length < 2) return nums.length;

        int ptr = 1;
        for (int i = 1; i < nums.length; ++i) {
            if (nums[i] != nums[ptr - 1]) nums[ptr++] = nums[i]; 
        }
        return ptr;
    }
}

80. Remove Duplicates from Sorted Array II

和I一个意思,都是ptr和i两个指针的关系判断。

public class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums == null || nums.length < 3) return nums.length;

        int ptr = 2;
        for (int i = 2; i < nums.length; ++i) {
            if (nums[i] == nums[ptr - 1] && nums[i] == nums[ptr - 2]) continue;
            else nums[ptr++] = nums[i];
        }
        return ptr;
    }
}

283. Move Zeros

FB 的超高频

这种写法中,我们调用 swap 的次数取决于从数组第一个 0 开始,后面到底有多少个非 0 元素。

一次 swap = 2次数组写入 + 1次 temp variable 写入,总写入次数为 O(3n),总数组写入次数为 O(2n)

public class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;

        int i = 0;
        while (i < nums.length && nums[i] != 0) i++;
        for (int j = i + 1; j < nums.length; ++j) {
            if (nums[j] != 0) swap(nums, i++, j);
        }
    }
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

然后 follow-up 肯定是如何减少写入次数 (aka 别用 swap)

这个时候解法就有点像27了,不为目标值的时候(这道题目标值为0),我们把当前值覆盖到前面,从头开始覆盖,不用管被覆盖的值是多少,因为我们只关心最后的结果。

和27不太一样的是,最后要再把0写回去,当然操作是很trivial的。

其实我觉得这个写法才是最直观的,暴力点用 swap 的写法反而 tricky 一点

这种写法中,数组每一个位置一定会被不多不少写入一次,写入次数为 O(n)

public class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;

        int ptr = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] != 0) nums[ptr++] = nums[i];
        }
        for (; ptr < nums.length; ++ptr) nums[ptr] = 0;
    }
}

485. Max Consecutive Ones

public class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        if (nums == null || nums.length == 0) return 0;

        int count = 0;
        int result = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] == 1) {
                count++;
                result = Math.max(result, count);
            } else count = 0;
        }
        return result;
    }
}

results matching ""

    No results matching ""