You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:22:11