当前位置: 首页 > news >正文

力扣80:删除有序数组中重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

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

示例 1:

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

示例 2:

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

思想:数组中的元素小于等于2时,不需要进行任何操作。只需要从第三个元素开始处理,将第三个个元素与第一个元素进行比较,如果为重复元素,则将快指针往后移动,出现不同时,则将慢指针往后移动,最后数组中剩下的元素个数为慢指针指向的下标。

代码:

int removeDuplicates(int* nums, int numsSize) {if(numsSize<=2){return numsSize;}int low=2,high=2;while(high<numsSize){if(nums[high] != nums[low-2]){nums[low]=nums[high];low++;}high++;} return low;
}

时间复杂度O(n);空间复杂度O(1)

注意:根据上述代码,如果只出现k次,可以总结如下:

int removeDuplicatesx(int* nums, int numsSize,int k) {if(numsSize<=k){return numsSize;}int low=k,high=k;while(high<numsSize){if(nums[high] != nums[low-k]){nums[low]=nums[high];low++;}high++;} return low;
}int removeDuplicates(int* nums, int numsSiz )  {return removeDuplicatesx(nums, numsSiz,2 );}

http://www.lryc.cn/news/468359.html

相关文章:

  • 等保测评:安全计算环境的详细讲解
  • [Java基础] Lambda 表达式
  • 《深入掌握高德地图 API:全面调用指南与最佳实践》
  • 【功能安全】系统架构设计
  • FPGA实现PCIE视频采集转USB3.0输出,基于XDMA+FT601架构,提供3套工程源码和技术支持
  • 基于docker-compose编排部署微服务快速开发框架
  • 【Java面试——并发编程——相关类和关键字——Day6】
  • Android 两种方式实现类似水波扩散效果
  • 基于SSM+小程序的垃圾分类管理系统(垃圾2)
  • 微服务网格Istio介绍
  • 【MySQL】视图与用户管理——MySQL
  • Go语言中三个输入函数(scanf,scan,scanln)的区别
  • uniapp使用html2canvas时,页面内的image元素模糊
  • 华为交换机堆叠
  • Spring Boot框架下中小企业设备管理系统开发
  • 鸿蒙开发融云demo消息未读数
  • 非对称加密算法(RSA):原理、应用与代码实现
  • docker部署SQL审核平台Archery
  • ceph 删除rbd 锁的命令
  • MySQL【知识改变命运】01
  • 苍穹外卖 Maven依赖配置
  • Lucas带你手撕机器学习——SVM支持向量机
  • 将后端返回的网络url转成blob对象,实现pdf预览
  • 民峰金融智能交易模型的应用与未来趋势
  • 文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑负荷时空迁移的5G基站与配电网协同优化运行 》
  • 数据结构中的堆(Heap)
  • Linux误删文件找回
  • 深入计算机语言之C++:类与对象(中)
  • 51单片机快速入门之 IIC I2C通信
  • 腾讯推出ima.copilot智能工作台产品 由混元大模型提供技术支持