Leetcode—— 删除排序数组中的重复项——C语言

简介: Leetcode—— 删除排序数组中的重复项——C语言

💗1.题目💗


给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。


考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:


更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。

返回 k 。

判题标准:


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


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 。不需要考虑数组中超出新长度后面的元素。


提示:


        1 <= nums.length <= 3 * 104

         -104 <= nums[i] <= 104

         nums 已按 非严格递增 排列


💗2.解答💗


❣️1.双指针❣️

时间复杂度为O(N),空间复杂度为O(1);

image.png

1、dst和src不相等,++dst

2、dst和src相等,++src

a[src]=a[dst]

++dst

本质是dst依次找跟src位置不相等值,依次从前往后覆盖存储


int removeDuplicates(int* nums, int numsSize) 
{
    int dst=1,src=0;
    while(dst<numsSize)
    {
        if(nums[src]!=nums[dst])
        {
         //   ++src;
          //  nums[src]=nums[dst];
           // ++dst;
            nums[++src]=nums[dst++];
        }
        else
        {
            ++dst;
        }
    }
    return src+1;//返回删除重复项后数组长度
}

image.png

❣️2. 暴力求解❣️

用i遍历数组,用j记录重复元素次数

int removeDuplicates(int* nums, int numsSize){
    int i, j = 0;                      
    for(i=0;i<numsSize-1;i++){          
        if(nums[i] == nums[i + 1])       
            j += 1;                      
        // 遇到重复的元素,j记录增加1;当for循环结束j累加完成,也代表共需要删去的数组长度
        nums[i + 1 - j] = nums[i + 1];  // 将下一个元素向前覆盖到非重复位置
    }
    numsSize -= j;                      // 删去数组冗余长度(遇到j个重复元素,所以原长度减j)
    return numsSize;
}

❣️3.比较写入❣️

时间复杂度为O(N),空间复杂度为O(1);


前后比较,遇到不相同的项,则在数组对应的位置写入即可


利用k的值代表有多少个不一样的项,前后比较,每遇到不同的项,(k+1)即为后面不同项在nums的对应下标,将后者直接读入nums中, 注意:由于每次写入的都是后面的项,最后返回时加上第一项;


int removeDuplicates(int* nums, int numsSize){
    int k= 0;
    for(int i = 0; i < numsSize-1; i++ )
    {
        if(nums[i]!=nums[i+1])
        {
            nums[++k] = nums[i+1];
        }
    }
    return k+1;
}
相关文章
|
6月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
268 1
|
10月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
513 0
一文彻底搞明白C语言的数组
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
877 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
358 5
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
254 4
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
226 6
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
256 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行