算法:删除有序数组的重复项

发布时间:2026/6/30 14:41:15
算法:删除有序数组的重复项 删除有序数组的重复项题目描述形象的比喻搬家整理书架for循环解法while循环解法题目描述给你一个非严格递增排列的数组nums请你原地删除重复出现的元素使每个元素只出现一次返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k你需要做以下事情更改数组nums使nums的前k个元素包含唯一元素并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。返回k。示例 1输入nums [1,1,2] 输出2, nums [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,_,_,_,_,_] 解释函数应该返回新的长度 5 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。通俗解释想象一下你在搬家需要整理书架上的书。书架上的书已经按作者姓氏的字母顺序排列好了但有些作者有多本书重复项。你的任务是把每个作者的第一本书保留在书架上把重复的作者书籍放到箱子里不需要管最后书架上的书都是不重复的且保持原来的顺序具体操作你从书架的第二本书开始检查第一本肯定要保留如果当前书和前面保留的书是同一个作者就把它放到箱子里如果当前书是新的作者就把它放到保留区的下一位置最后数一数保留区有多少本书这就是双指针算法的生动比喻for循环解法classSolution{publicintremoveDuplicates(int[]nums){// 边界情况如果数组为空或者只有一个元素直接返回长度即可if(numsnull||nums.length0){return0;}// 1. 定义慢指针 (slow)// 它的含义是[0, slow] 闭区间内的元素都是不重复的、整理好的// 初始时第0个位置的元素肯定要保留所以 slow 从 0 开始intslow0;// 2. 定义快指针 (fast)开始遍历// 从索引 1 开始因为索引 0 的元素我们已经默认放进去了for(intfast1;fastnums.length;fast){// 3. 核心逻辑对比// 如果快指针指向的数和慢指针指向的数不一样// 说明遇到了一个新数字if(nums[fast]!nums[slow]){// 4. 慢指针先向右挪一步腾出位置放新书slow;// 5. 把快指针找到的新书放到慢指针的位置// (其实这里可以直接赋值因为题目只要求前k个有序且不重复)nums[slow]nums[fast];}// 如果一样什么也不做快指针继续跑相当于把重复的书扔进了垃圾桶}// 6. 返回新数组的长度// 因为索引是从0开始的所以长度要 1returnslow1;}}while循环解法这是我自己的写法也通过了publicintremoveDuplicates(int[]nums){intslow0;//慢指针intfastslow1;//快指针intresult1;while(jnums.length){if(nums[slow]!nums[fast]){//根据题意result的当前个数就是新数组的下标nums[result]nums[fast];//计数1result;//慢指针移到快指针的位置slowfast;}fast;}returnresult;}