LeetCode移除有序数组重复项Java代码本地正确但在线提交失败求助
问题分析与解决
嘿,我懂你碰到的麻烦了!你的代码本地跑能算出正确的长度,但LeetCode提交失败的核心原因是没满足题目的「原地修改」要求——LeetCode的「移除有序数组中的重复项」不光要你返回去重后元素的个数,还要求你直接修改输入的nums数组,让数组的前k个元素(k是你返回的长度)就是去重后的结果,而你的代码完全没改动原数组,只是用两个ArrayList统计了数量,这肯定过不了系统的校验。
另外提一句,你的代码还没利用数组是有序这个关键条件,用contains方法判断重复其实效率很低,对于有序数组来说,我们只需要比较相邻元素就能知道是否重复,根本不需要额外的集合。
修正后的代码
这里给你一个符合题目要求的双指针解法,原地修改数组,时间复杂度O(n),空间复杂度O(1):
class Solution { public int removeDuplicates(int[] nums) { // 数组为空的情况直接返回0 if (nums.length == 0) { return 0; } // 慢指针,指向去重后数组的最后一个有效元素 int slow = 0; // 快指针遍历整个数组 for (int fast = 1; fast < nums.length; fast++) { // 当快指针遇到和慢指针不同的元素时 if (nums[fast] != nums[slow]) { // 慢指针向前移动一位 slow++; // 将快指针的元素赋值给慢指针位置 nums[slow] = nums[fast]; } } // 去重后的数组长度是慢指针+1 return slow + 1; } }
为什么这个解法能过?
- 完全原地修改
nums数组,没有使用任何额外的集合类 - 利用了数组有序的特性,只需要比较相邻元素就能判断重复,效率更高
- 返回的长度
slow+1对应的就是去重后元素的个数,同时nums数组的前slow+1个元素就是去重后的结果,完全符合LeetCode的校验要求
你把这段代码提交试试,应该就能通过了!
内容的提问来源于stack exchange,提问作者Edmond Dantes
相关产品推荐
相关产品推荐

