数组-原地删除排序数组重复项

题目说明

力扣链接

  • 给一个升序排列的数组nums,请原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
  • 元素的相对顺序应该保持一致。如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。
  • 将最终结果插入nums的前k个位置后返回k。不需要考虑数组中超出新长度后面的元素。
  • 不要使用额外的空间,并在使用 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]
提示:
0 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
nums已按升序排列

解法

【基于Java】

//-----------------main------------------------
	// 可改成控制台输入
	int[] nums = {1,2,3,5,6,6};
	int realLength = delMultiNum(nums);
	// 输出格式
	System.out.println("去重后数组元素长度为:" + realLength);
 	System.out.print("[");
	for (int i = 0; i < realLength; i++){
		 if(i+1 == realLength){
		 	System.out.print(nums[i]);
		 } else {
	    	System.out.print(nums[i]+",");
	    }
	}
	 System.out.print("]");
//-----------------method------------------------	
	private static int delMultiNum(int[] nums) {
		// 定义快慢指针
		int i = 0;
		int j = 1;
		// 排除异常情况
		int length = nums.length;
		if (length == 0 || length == 1 ){
		    return length;
		}
		while (j < length){
			// 如果慢指针所指的值小于了快指针所指的值
		    if (nums[i] < nums[j]){
		    	// 说明慢指针的下一个位置上的值应该是快指针所指的值
		        nums[i+1] = nums[j];
		        // 不必再比较当前位置了,于是慢指针后移
		        i++;
		    }
		    // 每一轮比较时:
		    // 不符合赋值情况:快指针后移,比较下一个;
		    // 符合赋值情况:赋值后慢指针和快指针所指的值一定相同,没有再次比较的必要,快指针也后移
	        j++;
		}
		// 因为是返回数组长度,所以要元素下标加1
		return i+1;
	}

思路

  • 双指针:移动规则
  • 排除异常情况
  • 循环比较值大小:循环结束条件
  • 符合条件赋新值

图解

数组-原地删除排序数组重复项

上一篇:基础DOS命令学习


下一篇:打开命令窗口和一些常用的Dos命令