首页 > 其他分享 >0080-删除有序数组中的重复项II

0080-删除有序数组中的重复项II

时间:2024-06-11 18:11:28浏览次数:12  
标签:nums int 元素 II 数组 长度 0080 输入

80. 删除有序数组中的重复项 II

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

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

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}
 

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

提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

题解

// [111222333]
// [112233]
func removeDuplicates(nums []int) int {
	n := len(nums)
	if n <= 2 {
		return n
	}

	// 记录当前值的个数
	count := 1
	l, r := 0, 1
	for l < r && r < n {
		// 元素相等且个数小于2
		if nums[r] == nums[l] && count == 1 {
			count++
			l++
			// 这里需要将元素拷贝过来,因为 r 很可能不是 l+1
			nums[l] = nums[r]
		} else if nums[r] > nums[l] {  // 找到了大点的元素
			l++
			nums[l] = nums[r]
			count = 1 // count 重新计数
		 j}
		r++
	}

    // l 是索引,所以要返回 l+1 表示个数·
	return l + 1
}

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

Leetcode-Go #双指针 #blog

标签:nums,int,元素,II,数组,长度,0080,输入
From: https://www.cnblogs.com/LanceZh/p/18242520

相关文章

  • LeetCode 419. 甲板上的战舰(深度优先搜索dfs、数组)
    419.甲板上的战舰思路:方法一,深度优先搜索dfs,遇到‘X’,就dfs一次,并在board中将其变为‘.’。classSolution{public:voiddfs(intx,inty,vector<vector<char>>&board){if(board[x][y]!='X')return;board[x][y]='.';if(x+1......
  • 算法课程笔记——树状数组基础
    算法课程笔记——树状数组基础如果不这样写会一直循环出错......
  • 0026-删除有序数组中的重复项
    26.删除有序数组中的重复项给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题......
  • 【算法与数据结构】【数组篇】【题1-题5】
    1.数组基本知识点1.1概念数组就是一个集合。数组会用一些名为索引的数字来标识每项数据在数组中的位置,且在大多数编程语言中,索引是从0算起的。我们可以根据数组中的索引,快速访问数组中的元素。数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存。1.2相关操......
  • 二维和多维数组概念
    目录1、二维数组2、多维数组1、二维数组在C语言中,当你定义一个二维数组时,你需要指定两个维度:行数和列数。二维数组就是在一维的数组上再嵌套了一层数组上去,使数组获得一种矩阵的假象。    inta[3][4]int是数组中元素的数据类型a 是数组的名称,即标识符。3是数......
  • 代码随想录算法训练营第三十五天 | 1005.K次取反后最大化的数组和 134.加油站 135.分
    1005.K次取反后最大化的数组和题目链接文章讲解视频讲解思路:  按绝对值从大到小排序  遍历数组,遇到负数,如果次数未用完就取反  最后如果剩余次数未用完且为奇数就将数组最后一个元素取反classSolution{staticboolmyCompare(constint&lhs,constint&r......
  • 每日一题(LeetCode 34题,在排序数组中查找元素的第一个和最后一个元素)
    题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题示例1:输入:nums=[5,7,7,8,8,10],......
  • 代码随想录——数组
    给定一个n个元素有序(升序)的整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1.//这个题说实话从逻辑上来看实在是太简单了,但是为什么每一次我写起来都感觉隐隐约约有点问题,为什么呢?就是因为我的问题没有得到解决,我只是一味的去逃......
  • Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组
    大家好,我是栗筝i,这篇文章是我的“栗筝i的Java技术栈”专栏的第004篇文章,在“栗筝i的Java技术栈”这个专栏中我会持续为大家更新Java技术相关全套技术栈内容。专栏的主要目标是已经有一定Java开发经验,并希望进一步完善自己对整个Java技术体系来充实自己的......
  • RGMII接口--->(011)FPGA实现RGMII接口(十一)
     (011)FPGA实现RGMII接口(十一)1目录(a)FPGA简介(b)IC简介(c)Verilog简介(d)FPGA实现RGMII接口(十一)(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种......