LeetCode移除有序数组重复项解法报错,请求排查问题
解决LeetCode「删除有序数组中的重复项」提交错误问题
我在LeetCode的「删除有序数组中的重复项」题目中提交了如下C#解法,但显示答案错误,麻烦帮忙找出代码问题:
public class Solution { public int RemoveDuplicates(int[] arr) { var dic = new Dictionary<int,int>(); for (int i = 0; i < arr.Length - 1; i++) { if (!dic.ContainsKey(arr[i])) { dic.Add(arr[i], i); } } if (!dic.ContainsKey(arr[arr.Length-1])) { dic.Add(arr[arr.Length - 1], dic.Count-1); } return dic.Count; } }
错误核心原因:题目要求原地修改输入数组,将去重后的元素放在数组的前k个位置(k为去重后的长度),但你的代码仅统计了不重复元素的数量,完全没有修改原数组,不符合题目要求。
代码具体问题:
- 违背题目核心规则:该题不仅需要返回去重后的长度,还必须在原数组上完成修改,让数组前k个元素是去重后的结果,你的代码完全没处理原数组,这是错误的关键。
- 冗余低效:输入数组是有序的,根本不需要用字典统计,字典会带来额外O(n)空间开销,而且拆分遍历最后一个元素的写法徒增代码复杂度。
修正后的C#解法(双指针法):
public class Solution { public int RemoveDuplicates(int[] nums) { 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; } }
修正说明:
- 双指针法原地修改数组,完全符合题目要求:慢指针
slow记录去重后的最后一个元素位置,快指针fast遍历数组寻找新的不重复元素。 - 时间复杂度O(n),空间复杂度O(1),比原字典解法更高效。
- 提前处理空数组的边界情况,避免索引越界问题。
内容的提问来源于stack exchange,提问作者Shakeer Hussain
相关产品推荐
相关产品推荐

