Leetcode 第六天 26. 删除有序数组中的重复项

LeetCode百日筑基系列主要是为了练习基础的数据结构与算法,题库全为LeetCode简单题(后面会在其他系列更新中等题和困难题),主要使用C语言和Java编写,前期的题目以完成功能为目的,后续会使用更优的算法以及优化代码块。

  1. 删除有序数组中的重复项
    给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
    由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
    将最终结果插入 nums 的前 k 个位置后返回 k 。
    不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k ==  expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i]  == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过。

示例 1:

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

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
C语言:

int removeDuplicates(int* nums, int numsSize){
    
    
    int i = 0, j = 0;
    for(; i < numsSize - 1; i++){
    
    
        if(nums[i] == nums[i + 1]){
    
    
           j++; 
        } 
        nums[i + 1 - j] = nums[i + 1];
    }
    numsSize = numsSize - j;
    return numsSize;
}

Java:

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
        if(nums == null || nums.length == 0) return 0;
        int p = 0;
        int q = 1;
        while(q < nums.length){
    
    
            if(nums[p] != nums[q]){
    
    
                nums[p + 1] = nums[q];
                p++;
            }
            q++;
        }
        return p + 1;
    }
}

解题思路:
首先注意数组是有序的,那么重复的元素一定会相邻。
要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。
考虑用 2 个指针,一个慢指针在前记作 p(i),一个快指针在后记作 q(i + 1),比较 p 和 q 位置的元素是否相等。如果相等,q 后移 1 位;如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位,重复上述过程,直到 q 等于数组长度。
返回 p + 1,即为新数组长度。

单等号(=):单纯的变量赋值
双等号(==):两个等号我们称为等值符,当等号两边的值为相同数据类型时,直接比较值是否相同,当类型不同时会发生数据类型的转换,转换为相同的类型后再进行比较。
三等号( === ):三个等号我们称为绝对等同符,既要判断数值也要判断数据类型是否相等,当等号两边的值为相同数据类型时,直接比较等号两边的值,值相同则返回true;若等号两边的值类型不同时直接返回false。

猜你喜欢

转载自blog.csdn.net/qq_43310387/article/details/123987667