算法-删除排序数组中的重复项(双指针法)

力扣(LeetCode)地址

题目:
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

示例 1:

给定数组 nums = [1,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。

你不需要考虑数组中超出新长度后面的元素。

实现思路:
默认两个人,一个p,一个q,q站在p的前面,

  • 如果p位置和q位置值不一样,则两者都向前跨一步(p和q不挨着,所以需要将q位置值赋值到p+1位置,然后两者都向前跨一步;p和q挨着,不需要重新赋值,只用两者都向前跨一步)
  • 如果一样,则p不动,q向前一步;
  • 直到p走到尽头;

实现:

class Solution {
    
    
	public int removeDuplicates(int[] nums) {
    
    
		int p = 0;
		int q = 1;
		while (q < nums.length) {
    
    
			if (nums[p] != nums[q]) {
    
    
				if ((p + 1) < q) {
    
    
					nums[p + 1] = nums[q];
				}
				p++;
			}
			q++;
		}
		return p + 1;
	}
}

仅此记录,代码有问题或者有更好的实现方式还请留言提出,谢谢

猜你喜欢

转载自blog.csdn.net/nongminkouhao/article/details/107957454