Java&LeetCode 初入门——026. 删除排序数组中的重复项

Java&LeetCode 初入门——026. 删除排序数组中的重复项

由于我实在没搞懂链表究竟是怎么一回事,所以无情地跳过了021,直接来到了026。
文内代码全部采用JAVA语言。

题目

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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。
你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

个人解法

一开始看到这个题目的设定是懵逼的,什么叫原地删除,真是令人费解。还有复杂度的要求,感觉非常混乱。悄悄参考一下答案,用的啥双指针,从来没听说过。所以还是决定采用两次循环的办法。两次循环写完之后,发现其实两层循环的条件不冲突不利用,遂改成一层循环,瞬间明白了什么叫双指针。个人理解的双指针就是,有两个指针(代表位置的int型整数i,j),指向两个不同位置,位置j自发地不停地往后移,带动位置i的移动。

神奇的是在调试时用的注释(此处未给出)加在里面居然比删除更快,难以理解。
加注释时:
执行用时: 8 ms, 在Remove Duplicates from Sorted Array的Java提交中击败了98.95% 的用户
删除注释:
执行用时: 14 ms, 在Remove Duplicates from Sorted Array的Java提交中击败了70.38% 的用户

不管怎么说,效果还是不错。以下直接给出代码。

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length==0) {
			return 0;
	    }//如果空数组,则长度直接为0
		int length=1;//长度初始化,非空数组说明新数组长度至少为1
		int i=0;
		int j=0;
		while(j<nums.length-1) {
		//j从第二个数字开始遍历
			j++;
			if ( nums[i]!=nums[j]) {
				//如果发现不一样的数,把这个新数,放到前面,代替原来重复的数。
				//例如i=0,j=2时,nums[i]!=nums[j],
				//那么就把nums[j]这个数放到第2个位置,也就是nums[length]
				nums[length]=nums[j];
				//那么新数列的长度+1,下次新数就可以放在第三个位置
				length++;
				//发现新数之后,给i赋新的值,j继续向后与这个新数比较。
				i=j;
			}	
		}
		return length;
	}
}

官方解法

方法

双指针法

算法

在这里插入图片描述

public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    int i = 0;
    for (int j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

可能是由于自己完成之前,就点开了官方解答,所以答案大同小异,不做赘述。

猜你喜欢

转载自blog.csdn.net/qq_27480345/article/details/85801282