双指针-删除排序数组的重复项

这篇博客介绍了如何使用双指针法解决在原地删除排序数组中重复元素的问题,使得每个元素只出现一次,并返回新的数组长度。算法思路是定义两个指针,一个目标位和一个待移动位,通过比较两个指针对应的元素来移动目标位并更新数组。这种方法可以在O(1)额外空间下完成,并将时间复杂度降低到O(n)。
摘要由CSDN通过智能技术生成

一、题目描述

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
在这里插入图片描述

二、理解题意

删除重复出现的元素,使每个元素只出现一次返回移除后数组的新长度

双指针解法:

  1. 定义两个指针(索引)分别指向目标位和待移动元素位
    • 初始目标位为0,待移动元素位为1
  2. 比较两个指针对应的数据
    • 比较相等:目标位不变,待移动位加1
    • 比较不等:目标位加1,待移动元素赋值到目标位;待移动位加1

在这里插入图片描述

什么情况下使用双指针:

两个按照一定规律同步变化的数据;
合理的使用双指针能将时间复杂度从O(n^2)降低到O(n)级别.

三、Choose 数据结构及算法思维选择

  • 数据结构:给定的数组

  • 算法思维:遍历、双指针

四、代码实现

public int removeDuplicates(int[] nums) {

	// 1.定义两个指针(索引)分别指向目标位和待移动元素位
	int target = 0; // 目标位指针
	for (int i = 1; i < nums.length; i++) { // i为待移动位指针
		
		// 2.比较两个指针对应的数据
		if (nums[target] != nums[i]) {
			// 不相等,则把目标位置后移
			if (++target != i) {
				nums[target] = nums[i];
			}
		}
	}
	return target + 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值