PisecesPeng / PisecesPeng.record.me

:beach_umbrella: All things are difficult before they are easy
MIT License
3 stars 1 forks source link

删除排序数组中的重复项 #35

Closed PisecesPeng closed 3 years ago

PisecesPeng commented 3 years ago

删除排序数组中的重复项

给定一个排序数组, 你需要在'原地'删除重复出现的元素,
使得每个元素只出现一次, 返回移除后数组的新长度.

不要使用额外的数组空间, 你必须在'原地'修改输入数组,
并在使用O(1)额外空间的条件下完成.

示例1:
给定数组 nums = [1, 1, 2],
函数应该返回新的长度2, 并且原数组nums的前两个元素被修改为1,2.
你不需要考虑数组中超出新长度后面的元素

示例2:
给定数组 nums = [0, 0, 1, 1, 2, 2, 3, 3, 4],
函数应该返回新的长度5, 并且原数组nums的前五个元素被修改为0,1,2,3,4.
你不需要考虑数组中超出新长度后面的元素

说明:
为什么返回数组值是整数, 但输出的答案是数组呢?

请注意, 输入数组是以'引用'方式传递的,
这意味着在函数里修改输入数组对于调用者是可见的.

你可以想象内部操作如下:

// nums 是以'引用'方式传递的. 也就是说, 不对实参做任何拷贝
int len = removeDuplicates(nums)

// 在函数里修改输入数组对于调用者是可见的.
// 根据你的函数返回的长度, 它会打印出数组中'该长度范围内'的所有元素
for (int i = 0; i < len; i++) {
    print(nums[i]);
}


题目地址: https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

PisecesPeng commented 3 years ago

解题思路

代码

public static int func(int[] ints) {
    // 判断数组是否有值
    int count = ints.length > 0 ? 1 : 0;
    for (int i = 1; i < ints.length; i++) {
        // 当且仅当 有序数组的当前值大于前一个值时
        if (ints[i] > ints[i - 1]) {
            // 将 count下标 赋予当前新的(不重复)值
            ints[count] = ints[i];
            // count自增, 1是为记录当前不重复的值个数, 2是为记录下一次新值的index
            count++;
        }
    }
    return count;
}
PisecesPeng commented 3 years ago

LeetCode题解

解题思路

代码

public static int func(int[] ints) {
    int n = nums.length;
    if (n == 0) {
        return 0;
    }
    int fast = 1, slow = 1;
    while (fast < n) {
        if (nums[fast] != nums[fast - 1]) {
            nums[slow] = nums[fast];
            ++slow;
        }
        ++fast;
    }
    return slow;
}