日拱一卒,月进一步(2)

简介: 那么,很快就来到了第二题的学习。哈哈~26. 删除有序数组中的重复项 - 力扣(LeetCode)

那么,很快就来到了第二题的学习。哈哈~

26. 删除有序数组中的重复项 - 力扣(LeetCode)

到了第二题,鄙人的脑子仍然是一团浆糊。比如,如何删除数据,以及如何查找重复的数据呢?这些对于一个菜菜来说,无疑是巨大的痛苦。

所以,让我们跟着思路学思想吧。

双指针

由于给定的数组是有序的 ,那么对于任意数组i<j,那么如果nums[i]=nums[j]。对于任意i<=k<=j,都有nums[i]=nums[k]=nums[j]。即相等的元素的下标一定是连续的。利用数组有序的特点,可以用双指针的方法删除重复元素。


如果数组的长度等于0,则数组不包含任何元素,返回0。如果数组nums的长度大于0,数组中至少有一个元素,删除重复元素之后也至少有一个元素。因此nums[0]维持现状即可,从nums[1]开始删除重复元素。定义两个指针:一个快指针和一个慢指针,快指针表示遍历数组到达的下标位置。慢指针表示下一个不同元素要填入的下标的位置。初始时两个指针都指向下标1。


一开始fast指针先走,如果fast等于前一个fast,那么fast继续向前走,如果fast不等于slow,那么把fast里面的值赋值给slow,slow再继续往前走。当fast走到末位时,越界访问,遍历结束。


int removeDuplicates(int* nums, int numsSize) 
{
    if(numsSize==0)
    {
        return 0;
    }
    int fast=1,slow=1;
    while(fast<numsSize)
    {
        if(nums[fast]!=nums[fast-1])//如果后一个fast不等于前一个fast,说明此时没有重复的元素
        {
            nums[slow]=nums[fast];//那么把fast的值赋值给slow,并且把slow往前移动
            ++slow;
        }
        ++fast;//如果有重复的元素,fast继续往后走,而slow不用移动
    }
    return slow;//新数组的长度即为slow指向的位置,fast已经越界
}

时间复杂度:O(n),其中 n是数组的长度。快指针和慢指针最多各移动 n次。

空间复杂度:O(1)。只需要使用常数的额外空间。

关于快慢指针就到这里了,我们下题再见!

相关文章
|
域名解析 Linux 网络安全
CentOS-7.2部署OpenLDAP服务器以及客户端
CentOS-7.2部署OpenLDAP服务器以及客户端
809 0
CentOS-7.2部署OpenLDAP服务器以及客户端
|
10月前
|
开发框架 缓存 自然语言处理
HarmonyOS ArkTS声明式UI开发实战教程
本文深入探讨了ArkTS作为HarmonyOS生态中新一代声明式UI开发框架的优势与应用。首先对比了声明式与命令式开发的区别,展示了ArkTS如何通过直观高效的代码提升可维护性。接着分析了其核心三要素:数据驱动、组件化和状态管理,并通过具体案例解析布局体系、交互组件开发技巧及复杂状态管理方案。最后,通过构建完整TODO应用实战,结合调试优化指南,帮助开发者掌握声明式UI设计精髓,感受ArkTS的独特魅力。文章鼓励读者通过“破坏性实验”建立声明式编程思维,共同推动HarmonyOS生态发展。
579 3
|
存储 Unix Linux
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
417 1
|
存储 数据可视化 数据挖掘
使用Matlab绘制简单的二维与三维图形
【10月更文挑战第3天】本文详细介绍了如何在 Matlab 中绘制简单的二维和三维图形,包括曲线图、柱状图、散点图、网格图、表面图、等高线图、多边形填充图、切片图及矢量场等。文章提供了丰富的代码示例,如使用 `plot`、`bar`、`scatter`、`plot3`、`mesh`、`surf`、`contour` 等函数绘制不同类型图形的方法,并介绍了 `rotate3d`、`comet3` 和 `movie` 等工具实现图形的交互和动画效果。通过这些示例,读者可以轻松掌握 Matlab 的绘图技巧,并应用于数据可视化和分析中。
|
存储 JavaScript 前端开发
块级作用域和函数作用域的区别在哪些方面会对性能产生影响?
【10月更文挑战第29天】块级作用域和函数作用域在变量查找效率、内存管理、闭包、代码执行顺序以及作用域链维护等方面的区别,都会在不同程度上对性能产生影响。在实际开发中,需要根据具体的代码逻辑、应用场景和性能需求,合理地选择和运用这两种作用域,以达到最佳的性能和代码质量平衡。
DB-GPT 首期源码解读系列直播回顾(视频版)
🚀 DB-GPT首期源码解读系列上线啦! ✨直播视频看点满满:项目发起人陈发强亲临,初次剖析架构,完整呈现从设计思考到架构逻辑的全过程,让你全面了解 DB-GPT。
|
存储 算法 安全
【MD5】什么是MD5?md5的简要描述
【MD5】什么是MD5?md5的简要描述
1002 0
springboot封装RedisTemplate
springboot封装RedisTemplate
183 6
|
Kubernetes 网络协议 容器
在K8S中,Pod的健康检查方式有哪些?
在K8S中,Pod的健康检查方式有哪些?
|
应用服务中间件 网络安全 数据安全/隐私保护
使用 Nginx 实现 HTTPS 网站设置
HTTPS 其实是有两部分组成:HTTP + SSL/TLS,也就是在 HTTP 的基础上又加了一层处理加密信息的模块。服务端和客户端的信息传递都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。
1092 0
使用 Nginx 实现 HTTPS 网站设置