删除有序数组中的重复项

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

法一:暴力解法:

遍历数组,当遇到与前一个元素相同的值时,将后面的元素整体向前移动一位。

注意:每删除一位重复元素,数组的有效长度-1,遍历索引回退一个位置。

cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
	//判断数组是否为空数组
	if (numsSize == 0) {
		return 0;
	}
	int count = numsSize;//记录数组中唯一元素的个数
	for (int i = 1; i < count; i++) {
		//判断当前元素是否与前一个元素相同,相同就将数组后面的元素整体向前移动一位
		if (nums[i] == nums[i - 1]) {
			for (int j = i; j < count; j++) {
				nums[j - 1] = nums[j];
			}
			//执行完后,i--,因为删除元素了,索引回退,且数组的有效长度要-1
			i--;
			count--;
		}
		
	}
	return  count;
}

法二:快慢指针解法

思路:当数组为空时,直接返回0;定义一个变量size,并初始化为0,用来记录数组最终的有效长度,快指针fast起始值为1,慢指针slow起始值为0,当快指针与慢指针指向的值相等时,同时++他们两,反之,将数组中慢指针指向元素赋值给size指向位置,同时,将fast,slow,size都++。最后,将最后一个元素赋值给size指向位置,同时size++,因为无论最后两个元素相同或者不相同,都不会被写入数组。

cpp 复制代码
//法二:双指针解法
int removeDuplicates(int* nums, int numsSize) {
	//判断数组是否为空数组
	if (numsSize == 0) {
		return 0;
	}
	//定义变量
	int size = 0;//用来记录有效数组的长度
	int slow = 0;
	for (int fast = 1; fast < numsSize; fast++) {
		//当快慢指针指向元素相等时,下标同时++
		if (nums[slow] == nums[fast]) {
			slow++;
		}
		else
		{
			//当快慢指针指向元素不相等时,将数组中慢指针指向元素赋值给size指向元素,fast,slow,size同时++
			nums[size] = nums[slow];
			size++;
			slow++;

		}
	}
	//最后,将最后一个元素的值赋值给size指向位置,同时size++
	nums[size] = nums[numsSize - 1];
	size++;
	return size;
}
相关推荐
漫霂12 小时前
二叉树的翻转
java·数据结构·算法
语戚12 小时前
力扣 51. N 皇后:基础回溯、布尔数组优化、位运算全解(Java 实现)
java·算法·leetcode·力扣·剪枝·回溯·位运算
熊猫钓鱼>_>12 小时前
从零构建大模型可调用的Skill:基于Function Calling的完整指南
人工智能·算法·语言模型·架构·agent·skill·functioncall
py有趣12 小时前
力扣热门100题之螺旋矩阵
算法·leetcode
3秒一个大13 小时前
深入理解 JS 中的栈与堆:从内存模型到数据结构,再谈内存泄漏
前端·javascript·数据结构
xiaoyaohou1113 小时前
003、轻量化改进(一):网络剪枝原理与实战
算法·机器学习·剪枝
我是章汕呐13 小时前
政策评估的“黄金标准”:DID模型从原理到Stata实操
大数据·人工智能·经验分享·算法·回归
2301_8227032013 小时前
光影进度条:鸿蒙Flutter实现动态光影效果的进度条
算法·flutter·华为·信息可视化·开源·harmonyos
人道领域13 小时前
【LeetCode刷题日记】383 赎金信
算法·leetcode·职场和发展
炽烈小老头13 小时前
【每天学习一点算法 2026/04/11】Pow(x, n)
学习·算法