算法题系列6·删除有序数组中的重复项

目录

题目描述

思路分析

实现


题目描述

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

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

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

示例 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 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按 非严格递增 排列

题目来源链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

思路分析

我们不清楚前面的某元素会和后面到底哪个位置的元素相等,所以势必会有前后多次判断的情况,如果两个指针一块移动,后面再次出现相同的值则前面的已无法回去, 而且元素是递增的,因此需要控制前面指针的移动时机,来避免不确定的位置判断、从而产生相等元素但遗漏的情况

办法就是用两个指针,一个快,一个慢,均单方向向前推进,慢的可能在某位置停留多次。

不着急写,先模拟推演一下看应该怎么办。

目的:0,0,1,1,1,2,2   -->   0,1,2,x,x,x,x

把x想象为一个特殊值,用来占位的,占位的只能往后面放,有用的数字在前面依次排列。 下面0号位置即索引为0的位置。

由于0和0相等,把第2个0修改为x,即0,x,1,1,1,2,2

循环到了2号位置,此时1号位置发现自己是x,则和下一位的1进行交换,即0,1,x,1,1,2,2

接下来循环到了3号位置,x需要和下一位比较、往后移动,将x和1交换:0,1,1,x,1,2,2 但又发现1号位置和2号位置相等, 则把后者改为x:0,1,x,x,1,2,2

循环到了4号位置,发现1号位置的1和4号位置的1又相等,因此4号位置的1被置为x,即:0,1,x,x,x,2,2

循环到了5号位置,由于5号位置的2 > 1号位置的1,因此将2和2号位置的x交换:0,1,2,x,x,x,2

循环到了6号位置,由于6号位置的2 = 2号位置的2,将6号位置修改为x:0,1,2,x,x,x,x

快指针已到头,循环停止。

实现

func removeDuplicates(nums []int) int {
	n := len(nums)
	if n == 0 {
		return 0
	}

	ret, i := n, 0           
	for j := 1; j < n; j++ { 
		if nums[j] <= nums[i] {
			nums[j] = 1e5
			ret--
			continue
		}

		i++
		if nums[i] == 1e5 {
			nums[j], nums[i] = nums[i], nums[j]
		}
	}

	return ret
}

验证:

	var nums1 = []int{1, 1, 2}
	n1 := removeDuplicates(nums1)
	fmt.Println(n1, nums1) // 2 [1 2 100000]

	var nums2 = []int{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}
	n2 := removeDuplicates(nums2)
	fmt.Println(n2, nums2) // 5 [0 1 2 3 4 100000 100000 100000 100000 100000]

	var nums3 = []int{2, 2, 3, 3}
	n3 := removeDuplicates(nums3)
	fmt.Println(n3, nums3) // 2 [2 3 100000 100000]

	var nums4 = []int{0, 0, 1, 1, 1, 2, 2}
	n4 := removeDuplicates(nums4)
	fmt.Println(n4, nums4) // 3 [0 1 2 100000 100000 100000 100000]

	var nums5 = []int{0, 0, 0, 1, 1, 2, 2}
	n5 := removeDuplicates(nums5)
	fmt.Println(n5, nums5) // 3 [0 1 2 100000 100000 100000 100000]

	var nums6 = []int{1, 2, 2, 2, 3}
	n6 := removeDuplicates(nums6)
	fmt.Println(n6, nums6) // 3 [1 2 3 100000 100000]

时间:单层循环,O(n)

空间:无额外空间消耗,O(1) 

提交结果

9b4b3c83033b48a79f2cf6dd73a78deb.png

解答可能并不唯一,仅供参考哦! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/263194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决:AD原理图网络无法更新同步到PCB

问题&#xff1a;表面上看起来引脚号都是一一对应的&#xff0c;但是Update过去就是无法同步。 解决&#xff1a; 检查并修改 元件管脚列 与 Name列 是否一一对应&#xff1a; 检查封装管脚模型匹配&#xff1a;

基于ssm高校实验室信息化综合管理平台建设系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本高校实验室信息化综合管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的…

【快速解决】python数据可视化时候无法显示中文字符的问题/图表中无法显示中文字符

目录 问题展示 解决方法 运行效果展示 问题展示 解决方法 加入以下代码即可 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False运行效果展示 成功运行出来 &#x1f30c;点击下方个人名片&#xff0c;交流会…

K8s攻击案例:Privileged特权容器导致节点沦陷

01、概述 特权容器&#xff08;Privileged Container&#xff09;是一种比较特殊的容器&#xff0c;在K8s中运行特权容器&#xff0c;需要将 Privileged 设为 true &#xff0c;容器可以执行几乎所有可以直接在主机上执行的操作。 基于此&#xff0c;利用容器的特权配置可以获取…

flutter开发实战-第一帧布局完成回调实现

flutter开发实战-第一帧布局完成回调实现 在开发中&#xff0c;我们有时候需要在第一帧布局完成后调用一些相关的方法。这里记录一下是实现过程。 Flutter中有多种不同的Binding&#xff0c;每种Binding都负责不同的功能。下面是Flutter中常见的Binding&#xff1a; 这里简单…

【权威认证】飞凌嵌入式FET113i-S核心板国产化率达100%

经中国赛宝实验室的严格认证&#xff0c;飞凌嵌入式FET113i-S核心板的电子元器件国产化率达100%——这款超高性价比的全国产核心板为新基建领域的国产化替代升级注入了新动力。 关于【中国赛宝实验室】 中国电子产品可靠性与环境试验研究所&#xff08;工业和信息化部电子第五研…

STM32 AI 模型测试

PC仿真软件测试 我在STM32单片机上跑神经网络算法—CUBE-AI_stm32cube.ai-CSDN博客 仿真软件测试结果和真实情况差距过大 云平台测试 Home - STM32Cube.AI Developer Cloud 上传模型文件 点击Start 选择优化方式 可以跳过量化步骤&#xff0c;到Benchmark 选择合适的型号&a…

配置OSPF多区域,实现内网互通---实验

目录 配置OSPF多区域&#xff0c;实现内网互通---实验 拓扑 需求&#xff1a; 配置步骤&#xff1a; 配置命令&#xff1a; 配置OSPF多区域&#xff0c;实现内网互通---实验 拓扑 需求&#xff1a; 1&#xff09;实现内网所有vlan和R1互通 2&#xff09;实现R1和SW5/SW6…

java开发面试:常见业务场景之单点登录SSO(JWT)、权限认证、上传数据的安全性的控制、项目中遇到的问题、日志采集(ELK)、快速定位系统的瓶颈

单点登录&#xff08;SSO&#xff09; 单点登录&#xff0c;Single Sign On&#xff08;简称SSO&#xff09;,只需要登录一次&#xff0c;就可以访问所有信任的应用系统。 如果是单个tomcat服务&#xff0c;session可以共享&#xff0c;如果是多个tomcat&#xff0c;那么服务s…

数字孪生模型:打造未来智能世界的核心力量

随着科技的飞速发展&#xff0c;我们正在逐步迈入一个全新的智能时代。在这个时代中&#xff0c;数字孪生模型成为了推动社会进步和产业变革的重要力量。它不仅改变了我们对世界的认知方式&#xff0c;还为各行各业带来了前所未有的创新与突破。 一、数字孪生模型的定义与原理 …

Grafana高可用-LDAP

一. grafana高可用 1. 迁移之前的 grafana sqlitedump.sh #!/bin/bash DB$1 TABLES$(sqlite3 $DB .tables | sed -r s/(\S)\s(\S)/\1\n\2/g | grep -v migration_log) for t in $TABLES; doecho "TRUNCATE TABLE $t;" done for t in $TABLES; doecho -e ".mode…

数学建模笔记-拟合算法

内容&#xff1a;拟合算法 一.概念&#xff1a; 拟合的结果就是找到一个确定的曲线 二.最小二乘法&#xff1a; 1. 2.最小二乘法的二表示的是平方的那个2 3.求解最小二乘法&#xff1a; 三.评价拟合的好坏 1.总体评分和SST&#xff1a; 2.误差平方和SSE&#xff1a; 3.回…

你知道海外云手机可以用于外贸测评吗?

目前随着外贸行业的发展&#xff0c;像亚马逊、速卖通、eBay等海外电商平台越来越火热。在这些平台&#xff0c;过硬的产品质量、优秀的服务、合适的价格&#xff0c;再加上适量的跨境电商测评&#xff0c;很容易就能吸引不少的客户。那么如何利用海外云手机进行外贸测评&#…

4 postman响应数据解析

上一篇:3 使用postman批量创建测试数据-CSDN博客 在接口测试中,从接口的响应结果中获取数据是很常用的。比如说做断言的时候,需要确保接口返回数据是符合预期的。又比如有些接口的输入参数值,需要用到前面接口运行返回的数据。下面先介绍如何解析响应数据(以json数…

百度网盘资源下载慢解决方法

1、使用百度网盘客户端&#xff0c;设置使用空闲带宽下载 亲测&#xff0c;可以一定程度上解决下载慢的问题&#xff0c;但是对于有些文件下载还是很慢就不清楚为什么了。 2、使用IDM进行下载 &#xff08;1&#xff09;、第一步下载和安装IDM 搜索后&#xff0c;普通下载后安…

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动&#xff0c;当时我用的是UnityChan这个unity官方自带的插件做的裙摆…

全自动双轴晶圆划片机:半导体制造的关键利器

随着科技的飞速发展&#xff0c;半导体行业正以前所未有的速度向前迈进。在这个过程中&#xff0c;全自动双轴晶圆划片机作为一种重要的设备&#xff0c;在半导体晶圆、集成电路、QFN、发光二极管、miniLED、太阳能电池、电子基片等材料的划切过程中发挥着举足轻重的作用。 全自…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景通过SDK获取相机信息的代码分析Baumer工业相机回调函数里保存原始图像数据Baumer保存Raw图像格式重要核心代…

简单的图片跑马灯效果

效果展示&#xff1a;gif 因速度太快展示不够流畅 实现方式 <div class"banner"><img class"img1" :src"image" v-for"(image, index) in imgs" :key"index" /></div><div class"banner"&…

netty源码:(32)Unpooled.copiedByffer方法

ByteBuf test Unpooled.copiedBuffer("fgh", Charset.defaultCharset());这个方法返回的ByteBuff,readerIndex为0&#xff0c; writerIndex为字符串长度。