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

力扣(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; 
	} 
} 

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/1417.html

(0)
上一篇 2021年7月15日
下一篇 2021年7月15日

相关推荐

发表回复

登录后才能评论