【Leetcode】删除数组中的重复项

Leetcode

题目要求

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

  • 示例1.给定 nums = [1,1,1,2,2,3]
  • 函数应该返回新长度length = 5,并且原数组的前五个元素被修改为1,1,2,2,3
  • 你不需要考虑数组中超出新长度后面的元素
  • 示例2.给定 nums = [0,0,1,1,1,1,2,3,3]
  • 函数应该返回新长度length = 7,并且原数组的前七个元素被修改为0,0,1,1,2,3,3
  • 你不需要考虑数组中超出新长度后面的元素

核心思想

这里的核心思想是扫描替换,利用两个坐标指针,实现数组元素的更新。替换也可以改为互换,但对于本题目要求,没必要进行此操作。

完整代码如下

public class Solution {
	
	public int replaceTwo(int[] nums){
		

		 	if(nums.length <= 2) {
	            return nums.length;
	        }
		 	//1,1,1,2,2,3
		 	
	        int count = 1;
	        //count为元素重复次数
	        int k = 1;
	 //核心思想是替换,将元素重复次数大于2的部分忽略,将其他合法元素移动到前面合法区域。      
	 //这里用i和k同时进行扫描,但是,当元素count不小于2时,(即两数相等次数达到2,也就是说相同元素达到3时)
	 //这时,k会停下,直到i找到下一个与当前k-1指向当元素不相等的那一个坐标,才继续进行替换,重复所有操作。       
	        for(int i = 1; i < nums.length; i++){
	        	//如果相等,则重复次数加1
	            if(nums[i] == nums[i-1]) {
	            	
	                if(count < 2) {
	                	//当重复达到两次时,才进行变换操作
	                    nums[k++] = nums[i];
	                    count++;
	                }
	            }else {
	            	//如果遇到两数不想等。则情况count次数
	                count = 1;
	                nums[k++] = nums[i];
	                
	            }
	        }
	        
	        return k;
		
	}
	
	public static void main(String[] args) {
		Solution sl = new Solution();
		int nums1[] = {0,0,1,1,1,2,3,3};
		int nums2[] = {0,0,1,1,1,2,3,3};
		int len1 = sl.replaceTwo(nums1);
		int len2 = sl.replaceTwo(nums2);
		for(int i = 0;i < len1; i++){
			System.out.print(nums1[i] + " ");
		}
		System.out.println();
		for(int j = 0;j < len2; j++){
			System.out.print(nums2[j] + " ");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42967016/article/details/84561237