LeetCode - 从排序数组中删除重复项

题目描述:

https://leetcodechina.com/explore/suan-fa/card/chu-ji-suan-fa/1/di-yi-zhang-jie/21/

给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。

不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。

给定数组: nums = [1,1,2],

你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2
不需要理会新的数组长度后面的元素

解题思路:

参考资料:http://www.cnblogs.com/grandyang/p/4329128.html

可以使用快慢指针,当数字相同时快指针后移,当数字不同时先移动慢指针再赋值。

那么这道题的解题思路是,我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数

最终代码:

public class RemoveDuplicates {
    @Test
    public void test1() {
        Assert.assertEquals(1, removeDuplicates1(new int[]{1, 1, 1}));
        Assert.assertEquals(0, removeDuplicates1(new int[]{}));
        Assert.assertEquals(1, removeDuplicates1(new int[]{1}));
        Assert.assertEquals(2, removeDuplicates1(new int[]{1, 1, 2}));
        Assert.assertEquals(3, removeDuplicates1(new int[]{1, 1, 2, 2, 2, 3, 3}));
        Assert.assertEquals(4, removeDuplicates1(new int[]{1, 2, 3, 4, 4, 4, 4}));
        Assert.assertEquals(5, removeDuplicates1(new int[]{1, 2, 3, 4, 5}));
    }

    // 快慢指针
    public int removeDuplicates1(int[] nums) {

        if (nums == null || nums.length == 0) {
            return 0;
        }

        int i = 0;
        int j = 0;

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

你可能感兴趣的:(LeetCode,消灭LeetCode)